Cosa consente a SQL Server di scambiare un nome oggetto per una stringa passata a una procedura di sistema


13

Cosa rende legale il passaggio di un nome oggetto alla procedura memorizzata di sistema sp_helptext?

Quale meccanismo converte il nome dell'oggetto in una stringa?

per esempio

-- 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

Sembra strano che non mi venga richiesto di citare nomi proc validi, a meno che non abbia un .nome di schema e un nome di procedura separati. Sto cercando una spiegazione di come viene convertito automaticamente da un nome tra virgolette in una stringa letterale da passare come valore del parametro.

Non ho un problema specifico da risolvere; Sono semplicemente curioso di cose che non sono documentate.


I contributi nei commenti sono stati spostati in questa chat room .
Paul White 9

Risposte:


10

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_helptextaccettare nomi di oggetti sia a parte singola (non qualificati) che multipart (qualificati).

Se il parser T-SQL interpreta l'elemento dopo sp_helptextcome 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 PARSENAMEe OBJECTID).

Come ultimo punto di interesse, notare che l'uso di virgolette doppie qui non dipende dall'impostazione di QUOTED_IDENTIFIER.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.