Lo que permite a SQL Server intercambiar un nombre de objeto por una cadena pasada a un procedimiento del sistema

13

¿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.

JJS
fuente
Las contribuciones en los comentarios se han trasladado a esta sala de chat .
Paul White 9

Respuestas:

10

El primer argumento para el procedimiento almacenado del sistema sp_helptextes:

[@objname= ] 'name'
Es el nombre calificado o no calificado de un objeto definido por el usuario y con ámbito de esquema. Las comillas solo son necesarias si se especifica un objeto calificado. Si se proporciona un nombre completo, incluido un nombre de base de datos, el nombre de la base de datos debe ser el nombre de la base de datos actual. El objeto debe estar en la base de datos actual. nombre es nvarchar(776), sin defecto.

Además, la documentación para identificadores delimitados (motor de base de datos) establece:

Uso de identificadores como parámetros en SQL Server
Muchos procedimientos almacenados del sistema, funciones y sentencias DBCC toman nombres de objetos como parámetros. Algunos de estos parámetros aceptan nombres de objetos de varias partes, mientras que otros solo aceptan nombres de una parte. Si se espera un nombre de una o varias partes determina cómo SQL Server analiza y usa internamente un parámetro.

Nombres de parámetros de una parte
Si el parámetro es un identificador de una parte, el nombre se puede especificar de las siguientes maneras:

  • Sin comillas ni delimitadores
  • Encerrado entre comillas simples
  • Encerrado entre comillas dobles
  • Encerrado entre paréntesis

Nombres de parámetros de
varias partes Los nombres de varias partes son nombres calificados que incluyen el nombre de la base de datos o del esquema y también el nombre del objeto. Cuando se utiliza un nombre multiparte como parámetro, SQL Server requiere que la cadena completa que conforma el nombre multiparte se encierre en un conjunto de comillas simples.


El primer argumento para sp_helptextaceptar nombres de objetos de una parte (no calificados) y multipartes (calificados).

Si el analizador T-SQL interpreta el elemento después sp_helptextcomo 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:

myproc - parte simple (sin comillas ni delimitadores - viñeta # 1)
[myproc] - pieza única (entre paréntesis - viñeta # 4)
'myproc' - parte simple (entre comillas simples - viñeta # 2)
'dbo.myproc' - multiparte con las comillas simples requeridas
[dbo.myproc] - una parte (entre paréntesis - viñeta # 4)

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:

dbo.myproc: multiparte sin las comillas simples requeridas
[dbo]. [myproc] - multiparte sin las comillas simples requeridas

Este ejemplo adicional usando comillas dobles es exitoso:

"dbo.myproc" - parte simple (entre comillas dobles - viñeta # 3)

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 PARSENAMEy OBJECTID).

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.

Paul White 9
fuente