Pourquoi est-il légal de transmettre un nom d'objet à la procédure stockée système sp_helptext
?
Quel mécanisme convertit le nom de l'objet en chaîne?
par exemple
-- 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
Il semble étrange que je ne sois pas obligé de citer des noms de proc valides, sauf s'il a un .
nom de schéma de séparation et un nom de procédure. Je cherche une explication de la façon dont il est converti automatiquement d'un nom entre guillemets en un littéral de chaîne à transmettre comme valeur du paramètre.
Je n'ai pas de problème spécifique à résoudre; Je suis simplement curieux des choses qui ne sont pas documentées.
Réponses:
Le premier argument de la procédure stockée système
sp_helptext
est:En outre, la documentation relative aux identificateurs délimités (moteur de base de données) indique:
Le premier argument pour
sp_helptext
accepter à la fois les noms d'objets en une seule partie (non qualifiés) et en plusieurs parties (qualifiés).Si l'analyseur T-SQL interprète l'élément après
sp_helptext
comme un nom en une seule partie (conformément aux quatre puces ci-dessus), le nom résultant est transmis en tant que valeur d'argument (type de chaîne) attendue par la procédure.Lorsque l'analyseur le voit comme un nom en plusieurs parties , le texte doit être entouré de guillemets simples comme indiqué.
La caractéristique clé d'un nom en plusieurs parties est un
.
séparateur (en dehors de tout délimiteur).Ces exemples de la question sont interprétés avec succès comme des noms en une seule partie:
Les deux derniers exemples de la question sont tous deux analysés en tant que noms de paramètres en plusieurs parties (en raison du
.
séparateur exposé ). Ils génèrent une erreur car ils ne contiennent pas les guillemets simples englobants requis:Cet exemple supplémentaire utilisant des guillemets doubles a réussi:
Notez qu'il est correctement interprété (pour la valeur du paramètre de procédure) comme étant un nom valide en une seule partie , mais le code de procédure est capable d'interpréter la chaîne (en plusieurs parties) qu'il reçoit de manière flexible (en utilisant
PARSENAME
etOBJECTID
).Comme dernier point d'intérêt, notez que l'utilisation de guillemets doubles ici ne dépend pas du réglage de
QUOTED_IDENTIFIER
.la source