Il primo argomento della procedura memorizzata nel sistema sp_helptext
è:
[
@objname
= ] 'name'
Nome qualificato o non qualificato di un oggetto con ambito schema definito dall'utente. Le virgolette sono necessarie solo se viene specificato un oggetto qualificato. Se viene fornito un nome completo, incluso un nome di database, il nome del database deve essere il nome del database corrente. L'oggetto deve essere nel database corrente. il nome è nvarchar(776)
, senza impostazione predefinita.
Inoltre, la documentazione per gli identificatori delimitati (Motore di database) afferma:
Utilizzo degli identificatori come parametri in SQL Server
Molte procedure, funzioni e istruzioni DBCC memorizzate nel sistema accettano i nomi degli oggetti come parametri. Alcuni di questi parametri accettano nomi di oggetti multipart, mentre altri accettano solo nomi di parti singole. Se è previsto un nome a parte singola o multiparte determina come un parametro viene analizzato e utilizzato internamente da SQL Server.
Nomi
dei parametri di una parte Se il parametro è un identificatore di una parte, il nome può essere specificato nei seguenti modi:
- Senza virgolette o delimitatori
- Racchiuso tra virgolette singole
- Racchiuso tra virgolette doppie
- Tra parentesi
Nomi dei parametri multipart I nomi
multipart sono nomi qualificati che includono il nome del database o dello schema e anche il nome dell'oggetto. Quando si utilizza un nome multipart come parametro, SQL Server richiede che la stringa completa che costituisce il nome multipart sia racchiusa tra virgolette singole.
Il primo argomento per sp_helptext
accettare nomi di oggetti sia a parte singola (non qualificati) che multipart (qualificati).
Se il parser T-SQL interpreta l'elemento dopo sp_helptext
come un nome a parte singola (in conformità con i quattro punti elenco sopra), il nome risultante viene passato come valore dell'argomento (tipo stringa) previsto dalla procedura.
Quando il parser lo vede come un nome multipart , il testo deve essere racchiuso tra virgolette singole come indicato.
La caratteristica chiave di un nome multipart è un .
separatore (al di fuori di qualsiasi delimitatore).
Questi esempi della domanda vengono interpretati correttamente come nomi a parte singola:
myproc - parte singola (senza virgolette o delimitatori - punto 1)
[myproc] - parte singola (tra parentesi - punto 4)
'myproc' - parte singola (tra virgolette singole - punto 2)
'dbo.myproc' - multipart con le virgolette singole richieste
[dbo.myproc] - parte singola (tra parentesi - punto 4)
Gli ultimi due esempi della domanda sono entrambi analizzati come nomi di parametri multipart (a causa del .
separatore esposto ). Producono un errore perché mancano delle virgolette singole racchiuse richieste:
dbo.myproc - multipart senza le virgolette singole richieste
[dbo]. [myproc] - multipart senza le virgolette singole richieste
Questo esempio aggiuntivo che utilizza le virgolette doppie ha esito positivo:
"dbo.myproc" - parte singola (tra virgolette doppie - punto 3)
Si noti che viene interpretato correttamente (per il valore del parametro di procedura) come un nome valido a parte singola , ma il codice di procedura è in grado di interpretare la stringa (multipart) che riceve in modo flessibile (usando PARSENAME
e OBJECTID
).
Come ultimo punto di interesse, notare che l'uso di virgolette doppie qui non dipende dall'impostazione di QUOTED_IDENTIFIER
.