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 seja obrigado a colocar aspas simples em nomes de procedimentos válidos, a menos que tenha um nome de .
esquema e nome de procedimento separados. Estou procurando uma explicação de como ele é convertido automaticamente de um nome entre aspas para uma string literal a ser passada como o valor do parâmetro.
Não tenho um problema específico para resolver; Estou simplesmente curioso sobre coisas que não estão documentadas.
O primeiro argumento para o procedimento armazenado do sistema
sp_helptext
é:Além disso, a documentação para Identificadores Delimitados (Mecanismo de Banco de Dados) afirma:
O primeiro argumento to
sp_helptext
aceita nomes de objeto de parte única (não qualificado) e de várias partes (qualificado).Se o analisador T-SQL interpretar o item seguinte
sp_helptext
como um nome de parte única (de acordo com os quatro marcadores acima), o nome resultante será passado como o valor do argumento (tipo de string) esperado pelo procedimento.Quando o analisador o vê como um nome de várias partes , o texto deve ser colocado entre aspas simples, conforme indicado.
O principal recurso de um nome com várias partes é um
.
separador (fora de qualquer delimitador).Esses exemplos da pergunta são interpretados com sucesso como nomes de parte única:
Os dois últimos exemplos da pergunta são analisados como nomes de parâmetros de várias partes (devido ao
.
separador exposto). Eles produzem um erro porque não possuem as aspas simples obrigatórias:Este exemplo extra usando aspas duplas é bem-sucedido:
Observe que ele é interpretado com sucesso (para o valor do parâmetro do procedimento) como sendo um nome válido de uma única parte , mas o código do procedimento é capaz de interpretar a string (com várias partes) que recebe de forma flexível (usando
PARSENAME
eOBJECTID
).Como último ponto de interesse, observe que o uso de aspas duplas aqui não depende da configuração de
QUOTED_IDENTIFIER
.