¿Qué hace que sea legal pasar un nombre de objeto al procedimiento almacenado del sistema sp_helptext
?
¿Qué mecanismo convierte el nombre del objeto en una cadena?
p.ej
-- 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
Parece extraño que no esté obligado a comillas simples nombres de proceso válidos, a menos que tenga un .
nombre de esquema separado y un nombre de procedimiento. Estoy buscando una explicación de cómo se convierte automáticamente de un nombre entre comillas a un literal de cadena para pasar como el valor del parámetro.
No tengo un problema específico que resolver; Simplemente me interesan las cosas que no están documentadas.
Respuestas:
El primer argumento para el procedimiento almacenado del sistema
sp_helptext
es:Además, la documentación para identificadores delimitados (motor de base de datos) establece:
El primer argumento para
sp_helptext
aceptar nombres de objetos de una parte (no calificados) y multipartes (calificados).Si el analizador T-SQL interpreta el elemento después
sp_helptext
como un nombre de parte única (de acuerdo con los cuatro puntos anteriores), el nombre resultante se pasa como el valor de argumento (tipo de cadena) esperado por el procedimiento.Cuando el analizador lo ve como un nombre de varias partes , el texto debe estar entre comillas simples como se indica.
La característica clave de un nombre multiparte es un
.
separador (fuera de los delimitadores).Estos ejemplos de la pregunta se interpretan con éxito como nombres de una parte:
Los dos últimos ejemplos de la pregunta se analizan como nombres de parámetros de varias partes (debido al
.
separador expuesto ). Producen un error porque carecen de las comillas simples que se incluyen:Este ejemplo adicional usando comillas dobles es exitoso:
Tenga en cuenta que se interpreta con éxito (para el valor del parámetro del procedimiento) como un nombre válido de una sola parte , pero el código del procedimiento puede interpretar la cadena (multiparte) que recibe de manera flexible (usando
PARSENAME
yOBJECTID
).Como último punto de interés, tenga en cuenta que el uso de comillas dobles aquí no depende de la configuración de
QUOTED_IDENTIFIER
.fuente