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.
Respostas:
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 a
sp_helptext
aceitar nomes de objetos de peça única (não qualificados) e multipartes (qualificados).Se o analisador T-SQL interpretar o item depois
sp_helptext
como 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:
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:Este exemplo extra usando aspas duplas é bem-sucedido:
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
PARSENAME
eOBJECTID
).Como ponto final de interesse, observe que o uso de aspas duplas aqui não depende da configuração de
QUOTED_IDENTIFIER
.fonte