Das erste Argument für die gespeicherte Systemprozedur sp_helptext
lautet:
[
@objname
= ] 'name'
Der qualifizierte oder nicht qualifizierte Name eines benutzerdefinierten Objekts mit Schemabereich. Anführungszeichen sind nur erforderlich, wenn ein qualifiziertes Objekt angegeben ist. Wenn ein vollständig qualifizierter Name einschließlich eines Datenbanknamens angegeben wird, muss der Datenbankname der Name der aktuellen Datenbank sein. Das Objekt muss sich in der aktuellen Datenbank befinden. Name ist nvarchar(776)
, ohne Voreinstellung.
Darüber hinaus heißt es in der Dokumentation zu Delimited Identifiers (Database Engine):
Verwenden von Bezeichnern als Parameter in SQL Server
Viele gespeicherte Systemprozeduren, Funktionen und DBCC-Anweisungen verwenden Objektnamen als Parameter. Einige dieser Parameter akzeptieren mehrteilige Objektnamen, während andere nur Einzelteilnamen akzeptieren. Ob ein ein- oder mehrteiliger Name erwartet wird, bestimmt, wie ein Parameter von SQL Server analysiert und intern verwendet wird.
Einteilige Parameternamen
Wenn der Parameter eine einteilige Kennung ist, kann der Name folgendermaßen angegeben werden:
- Ohne Anführungszeichen oder Begrenzer
- In einfachen Anführungszeichen eingeschlossen
- In doppelten Anführungszeichen
- In Klammern eingeschlossen
Multipart-Parameternamen
Multipart-Namen sind qualifizierte Namen, die den Datenbank- oder Schemanamen sowie den Objektnamen enthalten. Wenn ein mehrteiliger Name als Parameter verwendet wird, muss in SQL Server die vollständige Zeichenfolge, aus der der mehrteilige Name besteht, in einfache Anführungszeichen eingeschlossen werden.
Das erste Argument zu sp_helptext
sowohl einteilige (nicht qualifizierte) als auch mehrteilige (qualifizierte) Objektnamen akzeptiert.
Wenn der T-SQL-Parser das Element danach sp_helptext
als einteiligen Namen interpretiert (gemäß den obigen vier Aufzählungspunkten), wird der resultierende Name als der von der Prozedur erwartete Argumentwert (Zeichenfolgentyp) übergeben.
Wenn der Parser es als einen mehrteiligen Namen sieht , muss der Text wie angegeben in einfache Anführungszeichen gesetzt werden.
Das Hauptmerkmal eines mehrteiligen Namens ist ein .
Trennzeichen (ohne Begrenzer).
Diese Beispiele aus der Frage werden erfolgreich als Einzelteilnamen interpretiert:
myproc - einteilig (ohne Anführungszeichen oder Begrenzer - Aufzählungszeichen # 1)
[myproc] - einteilig (in Klammern - Punkt 4)
'myproc' - einteilig (in einfachen Anführungszeichen - Aufzählungszeichen 2)
'dbo.myproc' - mehrteilig mit den erforderlichen einfachen Anführungszeichen
[dbo.myproc] - einteilig (in Klammern - Punkt 4)
Die letzten beiden Beispiele aus der Frage werden (aufgrund des freigelegten .
Trennzeichens) beide als mehrteilige Parameternamen analysiert . Sie erzeugen einen Fehler, weil die erforderlichen einfachen Anführungszeichen fehlen:
dbo.myproc - mehrteilig ohne die erforderlichen einfachen Anführungszeichen
[dbo]. [myproc] - mehrteilig ohne die erforderlichen einfachen Anführungszeichen
Dieses zusätzliche Beispiel mit doppelten Anführungszeichen ist erfolgreich:
"dbo.myproc" - einteilig (in doppelten Anführungszeichen - Aufzählungszeichen # 3)
Beachten Sie, dass es erfolgreich (für den Prozedurparameterwert) als ein gültiger einteiliger Name interpretiert wird, der Prozedurcode jedoch die (mehrteilige) Zeichenfolge, die er empfängt, flexibel interpretieren kann (mithilfe von PARSENAME
und OBJECTID
).
Beachten Sie abschließend, dass die Verwendung von doppelten Anführungszeichen hier nicht von der Einstellung von abhängt QUOTED_IDENTIFIER
.