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.