O que permite ao SQL Server negociar um nome de objeto para uma sequência passada para um procedimento do sistema

13

O que faz com que seja legal passar um nome de objeto para o procedimento armazenado do sistema sp_helptext?

Qual mecanismo converte o nome do objeto em uma string?

por exemplo

-- 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 estranho que eu não precise citar nomes válidos de proc, a menos que ele tenha um .nome de esquema e um procedimento de separação. Estou procurando uma explicação de como ele é convertido automaticamente de um nome citado para uma string literal a ser passada como o valor do parâmetro.

Não tenho um problema específico para resolver; Sou simplesmente curioso sobre coisas que não estão documentadas.

JJS
fonte
As contribuições nos comentários foram movidas para esta sala de bate-papo .
Paul White 9

Respostas:

10

O primeiro argumento para o procedimento armazenado do sistema sp_helptexté:

[@objname= ] 'name'
É o nome qualificado ou não qualificado de um objeto definido pelo usuário e com escopo no esquema. As aspas são necessárias apenas se um objeto qualificado for especificado. Se um nome completo, incluindo um nome de banco de dados, for fornecido, o nome do banco de dados deverá ser o nome do banco de dados atual. O objeto deve estar no banco de dados atual. nome é nvarchar(776), sem padrão.

Além disso, a documentação para Identificadores Delimitados (Mecanismo de Banco de Dados) afirma:

Usando identificadores como parâmetros no SQL Server
Muitos procedimentos, funções e instruções DBCC armazenados no sistema usam nomes de objetos como parâmetros. Alguns desses parâmetros aceitam nomes de objetos com várias partes, enquanto outros aceitam apenas nomes de peças únicas. A expectativa de um nome de peça única ou multipartes determina como um parâmetro é analisado e usado internamente pelo SQL Server.

Nomes de parâmetros de peça única
Se o parâmetro for um identificador de peça única, o nome poderá ser especificado das seguintes maneiras:

  • Sem aspas ou delimitadores
  • Entre aspas simples
  • Entre aspas duplas
  • Fechado entre parênteses

Nomes de parâmetros de
várias partes Os nomes de várias partes são nomes qualificados que incluem o nome do banco de dados ou esquema e também o nome do objeto. Quando um nome de várias partes é usado como parâmetro, o SQL Server exige que a seqüência completa que compõe o nome de várias partes seja colocada entre um conjunto de aspas simples.


O primeiro argumento a sp_helptextaceitar nomes de objetos de peça única (não qualificados) e multipartes (qualificados).

Se o analisador T-SQL interpretar o item depois sp_helptextcomo um nome de peça única (de acordo com os quatro pontos de marcador acima), o nome resultante será passado como o valor do argumento (tipo de sequência) esperado pelo procedimento.

Quando o analisador o vê como um nome com várias partes , o texto deve estar entre aspas simples, conforme indicado.

O principal recurso de um nome de várias partes é um .separador (fora de qualquer delimitador).

Estes exemplos da pergunta são interpretados com sucesso como nomes de peça única:

myproc - peça única (sem aspas ou delimitadores - ponto 1)
[myproc] - peça única (entre parênteses - ponto 4)
'myproc' - peça única (entre aspas simples - ponto 2)
'dbo.myproc' - multipart com as aspas simples necessárias
[dbo.myproc] - peça única (entre colchetes - ponto 4)

Os dois últimos exemplos da pergunta são analisados ​​como nomes de parâmetros com várias partes (devido ao .separador exposto ). Eles produzem um erro porque não possuem as aspas simples anexas necessárias:

dbo.myproc - multipart sem as aspas simples necessárias
[dbo]. [myproc] - multipart sem as aspas simples necessárias

Este exemplo extra usando aspas duplas é bem-sucedido:

"dbo.myproc" - peça única (entre aspas duplas - ponto de marcador # 3)

Observe que ele é interpretado com êxito (para o valor do parâmetro do procedimento) como sendo um nome de peça única válido , mas o código do procedimento é capaz de interpretar a sequência (multipart) que recebe de forma flexível (usando PARSENAMEe OBJECTID).

Como ponto final de interesse, observe que o uso de aspas duplas aqui não depende da configuração de QUOTED_IDENTIFIER.

Paul White 9
fonte