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.
Antworten:
Das erste Argument für die gespeicherte Systemprozedur
sp_helptext
lautet:Darüber hinaus heißt es in der Dokumentation zu Delimited Identifiers (Database Engine):
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:
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:Dieses zusätzliche Beispiel mit doppelten Anführungszeichen ist erfolgreich:
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
undOBJECTID
).Beachten Sie abschließend, dass die Verwendung von doppelten Anführungszeichen hier nicht von der Einstellung von abhängt
QUOTED_IDENTIFIER
.quelle