Was ermöglicht es SQL Server, einen Objektnamen für eine Zeichenfolge zu handeln, die an eine Systemprozedur übergeben wird

13

Was führt dazu, dass es legal ist, einen Objektnamen an die gespeicherte Systemprozedur zu übergeben sp_helptext?

Welcher Mechanismus konvertiert den Objektnamen in eine Zeichenfolge?

z.B

-- works
sp_helptext myproc
sp_helptext [myproc]
sp_helptext [dbo.myproc]
-- and behaves the same as a string
sp_helptext 'myproc'
sp_helptext 'dbo.myproc'

-- does not work
sp_helptext dbo.myproc -- Msg 102, Level 15, State 1, Line 1 incorrect syntax near '.'
-- an additional case that does not work.
sp_helptext [dbo].[myproc] -- Msg 102, Level 15, State 1, Line 1 incorrect syntax

Es scheint seltsam , dass ich nicht bin erforderlich , um Apostroph gültig proc Namen, es sei denn , es hat. Trennschemanamen und Prozedurnamen. Ich suche nach einer Erklärung, wie es automatisch von einem in Anführungszeichen gesetzten Namen in ein Zeichenfolgenliteral konvertiert wird, das als Wert des Parameters übergeben wird.

Ich habe kein bestimmtes Problem zu lösen. Ich bin einfach neugierig auf Dinge, die nicht dokumentiert sind.

JJS
quelle
Beiträge in Kommentaren wurden in diesen Chatraum verschoben .
Paul White setzt Monica wieder ein

Antworten:

10

Das erste Argument für die gespeicherte Systemprozedur sp_helptextlautet:

[@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_helptextals 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 PARSENAMEund OBJECTID).

Beachten Sie abschließend, dass die Verwendung von doppelten Anführungszeichen hier nicht von der Einstellung von abhängt QUOTED_IDENTIFIER.

Paul White Setzen Sie Monica wieder ein
quelle