Apa yang menyebabkannya legal untuk meneruskan nama objek ke prosedur yang disimpan sistem sp_helptext
?
Mekanisme apa yang mengubah nama objek menjadi string?
misalnya
-- 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
Tampaknya aneh bahwa saya tidak diharuskan untuk mengutip nama proc yang valid, kecuali ia memiliki .
nama skema pemisah dan nama prosedur. Saya sedang mencari penjelasan tentang bagaimana ia dikonversi secara otomatis dari nama yang dikutip ke string literal untuk diteruskan sebagai nilai parameter.
Saya tidak memiliki masalah khusus untuk diselesaikan; Saya hanya ingin tahu tentang hal-hal yang tidak didokumentasikan.
Jawaban:
Argumen pertama untuk prosedur yang disimpan sistem
sp_helptext
adalah:Selain itu, dokumentasi untuk Pengidentifikasi Terbatas (Database Engine) menyatakan:
Argumen pertama yang
sp_helptext
menerima nama objek bagian tunggal (tidak memenuhi syarat) dan multipart (berkualifikasi).Jika parser T-SQL mengartikan item setelah
sp_helptext
sebagai nama bagian tunggal (sesuai dengan empat poin poin di atas), nama yang dihasilkan dilewatkan sebagai nilai argumen (tipe string) yang diharapkan oleh prosedur.Ketika parser melihatnya sebagai nama multi -bagian, teks harus dikelilingi dengan tanda kutip tunggal seperti yang dinyatakan.
Fitur kunci dari nama multi-bagian adalah
.
pemisah (di luar pembatas apa pun).Contoh-contoh dari pertanyaan ini berhasil ditafsirkan sebagai nama bagian tunggal:
Dua contoh terakhir dari pertanyaan keduanya diuraikan sebagai nama parameter multi bagian (karena
.
pemisah yang terbuka ). Mereka menghasilkan kesalahan karena tidak memiliki tanda kutip tunggal yang diperlukan:Contoh tambahan ini menggunakan tanda kutip ganda berhasil:
Perhatikan bahwa itu berhasil ditafsirkan (untuk nilai parameter prosedur) sebagai nama bagian tunggal yang valid , tetapi kode prosedur dapat menafsirkan string (multi-bagian) yang diterimanya secara fleksibel (menggunakan
PARSENAME
danOBJECTID
).Sebagai poin akhir yang menarik, perhatikan bahwa menggunakan tanda kutip ganda di sini tidak tergantung pada pengaturan
QUOTED_IDENTIFIER
.sumber