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_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:
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 PARSENAME
e OBJECTID
).
Como ponto final de interesse, observe que o uso de aspas duplas aqui não depende da configuração de QUOTED_IDENTIFIER
.