Apa yang memungkinkan SQL Server untuk memperdagangkan nama objek untuk string yang diteruskan ke prosedur sistem

13

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.

JJS
sumber
Kontribusi dalam komentar telah dipindahkan ke ruang obrolan ini .
Paul White 9

Jawaban:

10

Argumen pertama untuk prosedur yang disimpan sistem sp_helptextadalah:

[@objname= ] 'name'
Apakah nama yang memenuhi syarat atau tidak memenuhi syarat dari objek yang ditentukan pengguna, skema-lingkup. Tanda kutip diperlukan hanya jika objek yang memenuhi syarat ditentukan. Jika nama yang sepenuhnya memenuhi syarat, termasuk nama basis data, disediakan, nama basis data haruslah nama dari basis data saat ini. Objek harus dalam database saat ini. namanya nvarchar(776), tanpa standar.

Selain itu, dokumentasi untuk Pengidentifikasi Terbatas (Database Engine) menyatakan:

Menggunakan Pengidentifikasi Sebagai Parameter dalam SQL Server
Banyak prosedur, fungsi, dan pernyataan DBCC yang disimpan sistem menggunakan nama objek sebagai parameter. Beberapa parameter ini menerima nama objek multi bagian, sementara yang lain hanya menerima nama bagian tunggal. Apakah satu bagian atau nama multi bagian diharapkan menentukan bagaimana suatu parameter diuraikan dan digunakan secara internal oleh SQL Server.

Nama Parameter bagian tunggal
Jika parameternya adalah pengenal satu bagian, nama dapat ditentukan dengan cara berikut:

  • Tanpa tanda kutip atau pembatas
  • Terlampir dalam tanda kutip tunggal
  • Terlampir dalam tanda kutip ganda
  • Terlampir dalam kurung

Nama Parameter Multipart Nama
multipart adalah nama yang memenuhi syarat yang mencakup database atau nama skema dan juga nama objek. Ketika nama multi bagian digunakan sebagai parameter, SQL Server mensyaratkan bahwa string lengkap yang membentuk nama multi bagian dilampirkan dalam satu set tanda kutip tunggal.


Argumen pertama yang sp_helptextmenerima nama objek bagian tunggal (tidak memenuhi syarat) dan multipart (berkualifikasi).

Jika parser T-SQL mengartikan item setelah sp_helptextsebagai 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:

myproc - satu bagian (tanpa tanda kutip atau pembatas - bullet # 1)
[myproc] - satu bagian (dalam kurung - peluru # 4)
'myproc' - satu bagian (dalam tanda kutip tunggal - bullet # 2)
'dbo.myproc' - multi dengan tanda kutip tunggal yang diperlukan
[dbo.myproc] - satu bagian (dalam kurung - peluru # 4)

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:

dbo.myproc - multi bagian tanpa tanda kutip tunggal yang diperlukan
[dbo]. [myproc] - mulailah tanpa tanda kutip tunggal yang diperlukan

Contoh tambahan ini menggunakan tanda kutip ganda berhasil:

"dbo.myproc" - satu bagian (dalam tanda kutip ganda - titik peluru # 3)

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 PARSENAMEdan OBJECTID).

Sebagai poin akhir yang menarik, perhatikan bahwa menggunakan tanda kutip ganda di sini tidak tergantung pada pengaturan QUOTED_IDENTIFIER.

Paul White 9
sumber