Co powoduje, że legalne jest przekazywanie nazwy obiektu do procedury przechowywanej w systemie sp_helptext
?
Jaki mechanizm konwertuje nazwę obiektu na ciąg?
na przykład
-- 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
Wydaje się dziwne, że nie jestem zobowiązany do apostrof poprawnych nazw proc, chyba że ma .
oddzielającą nazwę schematu i nazwę postępowania. Szukam wyjaśnienia, w jaki sposób jest automatycznie konwertowane z cytowanej nazwy na literał łańcuchowy, który ma zostać przekazany jako wartość parametru.
Nie mam konkretnego problemu do rozwiązania; Jestem po prostu dociekliwy w sprawach, które nie są udokumentowane.
Odpowiedzi:
Pierwszy argument systemowej procedury składowanej
sp_helptext
to:Ponadto dokumentacja dla identyfikatorów rozdzielanych (aparat bazy danych) stanowi:
Pierwszy argument, który
sp_helptext
akceptuje zarówno nazwy obiektów jednoczęściowe (niekwalifikowane), jak i wieloczęściowe (kwalifikowane).Jeśli parser T-SQL interpretuje element
sp_helptext
jako nazwę pojedynczej części (zgodnie z czterema punktorami powyżej), wynikowa nazwa jest przekazywana jako wartość argumentu (typu ciągu) oczekiwana przez procedurę.Gdy parser widzi to jako nazwę składającą się z wielu części , tekst musi być otoczony pojedynczymi cudzysłowami, jak podano.
Kluczową cechą nazwy wieloczęściowej jest
.
separator (poza ogranicznikami).Te przykłady z pytania z powodzeniem interpretuje się jako nazwy jednoczęściowe:
Dwa ostatnie przykłady pytania są analizowane jako nazwy parametrów wieloczęściowych (ze względu na odsłonięty
.
separator). Powodują błąd, ponieważ brakuje wymaganych, obejmujących je pojedynczych cudzysłowów:Ten dodatkowy przykład z użyciem podwójnych cudzysłowów jest udany:
Zauważ, że jest z powodzeniem interpretowany (dla wartości parametru procedury) jako poprawna nazwa pojedynczej części , ale kod procedury jest w stanie interpretować (wieloczęściowy) ciąg, który odbiera elastycznie (używając
PARSENAME
iOBJECTID
).Jako ostatni punkt zainteresowania należy zauważyć, że użycie tutaj podwójnych cudzysłowów nie zależy od ustawienia
QUOTED_IDENTIFIER
.źródło