sp_describe_undeclared_parameters (T-SQL)
Berlaku untuk: Titik akhir analitik SQL ServerAzure SQL Database Azure SQL Managed Instance Azure Synapse Analytics SQL di Microsoft Fabric Warehouse di Microsoft Fabric
Mengembalikan tataan hasil yang berisi metadata tentang parameter yang tidak dinyatakan dalam batch Transact-SQL. Mempertimbangkan setiap parameter yang digunakan dalam batch @tsql , tetapi tidak dideklarasikan dalam @params. Kumpulan hasil dikembalikan yang berisi satu baris untuk setiap parameter tersebut, dengan informasi jenis yang disimpulkan untuk parameter tersebut. Prosedur mengembalikan tataan hasil kosong jika batch input @tsql tidak memiliki parameter kecuali yang dinyatakan dalam @params.
Sintaksis
sp_describe_undeclared_parameters
[ @tsql = ] 'Transact-SQL_batch'
[ , [ @params = ] N'@parameter_name data_type [ , ... n ]' ]
Catatan
Untuk menggunakan prosedur tersimpan ini di Azure Synapse Analytics di kumpulan SQL khusus, atur tingkat kompatibilitas database ke atau yang 20
lebih tinggi. Untuk menolak, ubah tingkat kompatibilitas database menjadi 10
.
Argumen
[ @tsql = ] 'tsql'
Satu atau beberapa pernyataan Transact-SQL. @tsql mungkin nvarchar(n) atau nvarchar(max).
[ @params = ] N'@parameter_name data_type [ ,... n ]'
@params menyediakan string deklarasi untuk parameter untuk batch Transact-SQL, mirip dengan cara sp_executesql
kerjanya. @params mungkin nvarchar(n) atau nvarchar(max).
String yang berisi definisi semua parameter yang disematkan dalam @tsql. String harus berupa konstanta Unicode atau variabel Unicode. Setiap definisi parameter terdiri dari nama parameter dan jenis data. n adalah tempat penampung yang menunjukkan definisi parameter tambahan. Jika pernyataan Transact-SQL atau batch dalam pernyataan tidak berisi parameter, @params tidak diperlukan. Nilai default untuk parameter ini adalah NULL
.
Mengembalikan nilai kode
sp_describe_undeclared_parameters
selalu mengembalikan status nol pada keberhasilan. Jika prosedur melemparkan kesalahan dan prosedur disebut sebagai RPC, status pengembalian diisi oleh jenis kesalahan seperti yang dijelaskan dalam error_type
kolom sys.dm_exec_describe_first_result_set
. Jika prosedur dipanggil dari Transact-SQL, nilai pengembalian selalu nol, bahkan dalam kasus kesalahan.
Tataan hasil
sp_describe_undeclared_parameters
mengembalikan tataan hasil berikut.
Nama kolom | Jenis data | Deskripsi |
---|---|---|
parameter_ordinal |
int | Berisi posisi ordinal parameter dalam tataan hasil. Posisi parameter pertama ditentukan sebagai 1 . Tidak dapat diubah ke null. |
name |
nama sysname | Berisi nama parameter. Tidak dapat diubah ke null. |
suggested_system_type_id |
int | system_type_id Berisi jenis data parameter seperti yang ditentukan dalam sys.types .Untuk jenis CLR, meskipun system_type_name kolom mengembalikan NULL , kolom ini mengembalikan nilai 240 . Tidak dapat diubah ke null. |
suggested_system_type_name |
nvarchar(256) | Berisi nama jenis data. Menyertakan argumen (seperti panjang, presisi, skala) yang ditentukan untuk jenis data parameter. Jika jenis data adalah jenis alias yang ditentukan pengguna, jenis sistem yang mendasar ditentukan di sini. Jika jenis data yang ditentukan pengguna CLR, NULL dikembalikan dalam kolom ini. Jika jenis parameter tidak dapat disimpulkan, NULL dikembalikan. Dapat diubah ke null. |
suggested_max_length |
smallint | Lihat sys.columns . untuk max_length deskripsi kolom. Tidak dapat diubah ke null. |
suggested_precision |
kecil | Lihat sys.columns . untuk deskripsi kolom presisi. Tidak dapat diubah ke null. |
suggested_scale |
kecil | Lihat sys.columns . untuk deskripsi kolom skala. Tidak dapat diubah ke null. |
suggested_user_type_id |
int | Untuk jenis CLR dan alias, berisi user_type_id jenis data kolom seperti yang ditentukan dalam sys.types . Jika tidak, adalah NULL . Dapat diubah ke null. |
suggested_user_type_database |
nama sysname | Untuk jenis CLR dan alias, berisi nama database tempat jenis ditentukan. Jika tidak, adalah NULL . Dapat diubah ke null. |
suggested_user_type_schema |
nama sysname | Untuk jenis CLR dan alias, berisi nama skema di mana jenis ditentukan. Jika tidak, adalah NULL . Dapat diubah ke null. |
suggested_user_type_name |
nama sysname | Untuk jenis CLR dan alias, berisi nama jenis . Jika tidak, adalah NULL . |
suggested_assembly_qualified_type_name |
nvarchar(4000) | Untuk jenis CLR, mengembalikan nama rakitan dan kelas yang menentukan jenisnya. Jika tidak, adalah NULL . Dapat diubah ke null. |
suggested_xml_collection_id |
int | xml_collection_id Berisi jenis data parameter seperti yang ditentukan dalam sys.columns . Kolom ini mengembalikan NULL jika jenis yang dikembalikan tidak terkait dengan kumpulan skema XML. Dapat diubah ke null. |
suggested_xml_collection_database |
nama sysname | Berisi database tempat kumpulan skema XML yang terkait dengan jenis ini ditentukan. Kolom ini mengembalikan NULL jika jenis yang dikembalikan tidak terkait dengan kumpulan skema XML. Dapat diubah ke null. |
suggested_xml_collection_schema |
nama sysname | Berisi skema di mana kumpulan skema XML yang terkait dengan jenis ini ditentukan. Kolom ini mengembalikan NULL jika jenis yang dikembalikan tidak terkait dengan kumpulan skema XML. Dapat diubah ke null. |
suggested_xml_collection_name |
nama sysname | Berisi nama kumpulan skema XML yang terkait dengan tipe ini. Kolom ini mengembalikan NULL jika jenis yang dikembalikan tidak terkait dengan kumpulan skema XML. Dapat diubah ke null. |
suggested_is_xml_document |
bit | Mengembalikan 1 jika jenis yang dikembalikan adalah XML dan jenis tersebut dijamin sebagai dokumen XML. Jika tidak, mengembalikan 0 . Tidak dapat diubah ke null. |
suggested_is_case_sensitive |
bit | Mengembalikan 1 jika kolom adalah jenis string peka huruf besar/kecil dan 0 jika tidak. Tidak dapat diubah ke null. |
suggested_is_fixed_length_clr_type |
bit | Mengembalikan jika kolom berjenis 1 CLR dengan panjang tetap dan 0 jika tidak. Tidak dapat diubah ke null. |
suggested_is_input |
bit | Mengembalikan 1 jika parameter digunakan di mana saja selain sisi kiri penugasan. Jika tidak, mengembalikan 0 . Tidak dapat diubah ke null. |
suggested_is_output |
bit | Mengembalikan 1 jika parameter digunakan di sisi kiri penugasan atau diteruskan ke parameter output dari prosedur tersimpan. Jika tidak, mengembalikan 0 . Tidak dapat diubah ke null. |
formal_parameter_name |
nama sysname | Jika parameter adalah argumen untuk prosedur tersimpan atau fungsi yang ditentukan pengguna, mengembalikan nama parameter formal yang sesuai. Jika tidak, mengembalikan NULL . Dapat diubah ke null. |
suggested_tds_type_id |
int | Untuk penggunaan internal. Tidak dapat diubah ke null. |
suggested_tds_length |
int | Untuk penggunaan internal. Tidak dapat diubah ke null. |
Keterangan
sp_describe_undeclared_parameters
selalu mengembalikan status nol.
Penggunaan yang paling umum adalah ketika aplikasi diberi pernyataan Transact-SQL yang mungkin berisi parameter dan harus memprosesnya dalam beberapa cara. Contohnya adalah antarmuka pengguna (seperti ODBCTest
atau RowsetViewer
) di mana pengguna menyediakan kueri dengan sintaks parameter ODBC. Aplikasi harus secara dinamis menemukan jumlah parameter dan meminta pengguna untuk masing-masing parameter.
Contoh lain adalah ketika tanpa input pengguna, aplikasi harus mengulangi parameter dan mendapatkan data untuk mereka dari beberapa lokasi lain (seperti tabel). Dalam hal ini, aplikasi tidak perlu meneruskan semua informasi parameter sekaligus. Sebagai gantinya, aplikasi bisa mendapatkan semua informasi parameter dari penyedia dan mendapatkan data itu sendiri dari tabel. Kode yang menggunakan sp_describe_undeclared_parameters
lebih umum dan cenderung tidak memerlukan modifikasi jika struktur data berubah nanti.
sp_describe_undeclared_parameters
mengembalikan kesalahan dalam salah satu kasus berikut.
Input @tsql bukan batch Transact-SQL yang valid. Validitas ditentukan dengan mengurai dan menganalisis batch Transact-SQL. Kesalahan apa pun yang disebabkan oleh batch selama pengoptimalan kueri atau selama eksekusi tidak dipertimbangkan saat menentukan apakah batch Transact-SQL valid.
@params tidak
NULL
dan berisi string yang bukan string deklarasi yang valid secara sintis untuk parameter, atau jika berisi string yang mendeklarasikan parameter apa pun lebih dari satu kali.Input batch Transact-SQL mendeklarasikan variabel lokal dengan nama yang sama dengan parameter yang dideklarasikan dalam @params.
Pernyataan ini mereferensikan tabel sementara.
Kueri menyertakan pembuatan tabel permanen yang kemudian dikueri.
Jika @tsql tidak memiliki parameter, selain parameter yang dinyatakan dalam @params, prosedur mengembalikan tataan hasil kosong.
Catatan
Anda harus mendeklarasikan variabel sebagai variabel Transact-SQL skalar, atau kesalahan muncul.
Algoritma pemilihan parameter
Untuk kueri dengan parameter yang tidak dinyatakan, pengurangan jenis data untuk parameter yang tidak dinyatakan berlangsung dalam tiga langkah.
Langkah 1: Temukan jenis data sub-ekspresi
Langkah pertama dalam pengurangan jenis data untuk kueri dengan parameter yang tidak dinyatakan adalah menemukan jenis data semua sub-ekspresi yang jenis datanya tidak bergantung pada parameter yang tidak dinyatakan. Jenis dapat ditentukan untuk ekspresi berikut:
- Kolom, konstanta, variabel, dan parameter yang dideklarasikan.
- Hasil panggilan ke fungsi yang ditentukan pengguna (UDF).
- Ekspresi dengan jenis data yang tidak bergantung pada parameter yang tidak dinyatakan untuk semua input.
Misalnya, pertimbangkan SELECT dbo.tbl(@p1) + c1 FROM t1 WHERE c2 = @p2 + 2
kueri. Ekspresi dbo.tbl(@p1) + c1
dan c2
memiliki jenis data, serta ekspresi @p1
dan @p2 + 2
tidak.
Setelah langkah ini, jika ada ekspresi (selain panggilan ke UDF) memiliki dua argumen tanpa jenis data, pengurangan jenis gagal dengan kesalahan. Misalnya, semua kesalahan yang dihasilkan berikut:
SELECT * FROM t1 WHERE @p1 = @p2;
SELECT * FROM t1 WHERE c1 = @p1 + @p2;
SELECT * FROM t1 WHERE @p1 = SUBSTRING(@p2, 2, 3);
Contoh berikut tidak menghasilkan kesalahan:
SELECT * FROM t1 WHERE @p1 = dbo.tbl(c1, @p2, @p3);
Langkah 2: Temukan ekspresi paling dalam
Untuk parameter @p
yang tidak dinyatakan tertentu , algoritma pengurangan jenis menemukan ekspresi E(@p)
terdarah yang berisi @p
dan merupakan salah satu argumen berikut:
- Argumen ke operator perbandingan atau penugasan.
- Argumen ke fungsi yang ditentukan pengguna (termasuk UDF bernilai tabel), prosedur, atau metode.
- Argumen ke
VALUES
klausaINSERT
pernyataan. - Argumen ke
CAST
atauCONVERT
.
Algoritma pengurangan jenis menemukan jenis TT(@p)
data target untuk E(@p)
. Jenis data target untuk contoh sebelumnya adalah sebagai berikut:
- Jenis data dari sisi lain perbandingan atau penugasan.
- Jenis data yang dideklarasikan dari parameter tempat argumen ini diteruskan.
- Tipe data kolom tempat nilai ini disisipkan.
- Jenis data tempat pernyataan ditransmisikan atau dikonversi.
Misalnya, pertimbangkan SELECT * FROM t WHERE @p1 = dbo.tbl(@p2 + c1)
kueri. Kemudian E(@p1) = @p1
, , TT(@p1)
E(@p2) = @p2 + c1
adalah jenis data pengembalian yang dideklarasikan dari dbo.tbl
, dan TT(@p2)
merupakan jenis data parameter yang dideklarasikan untuk dbo.tbl
.
Jika @p
tidak terkandung dalam ekspresi apa pun yang tercantum di awal langkah 2, algoritma pengurangan jenis menentukan bahwa E(@p)
adalah ekspresi skalar terbesar yang berisi @p
, dan algoritma pengurangan jenis tidak menghitung jenis TT(@p)
data target untuk E(@p)
. Misalnya, jika kueri adalah SELECT @p + 2
, E(@p) = @p + 2
dan tidak TT(@p)
ada .
Langkah 3: Menyimpulkan jenis data
Sekarang setelah E(@p)
dan TT(@p)
diidentifikasi, algoritma pengurangan jenis menyimpulkan jenis data untuk @p
dengan salah satu dari dua cara berikut:
Pengurangan sederhana
Jika
E(@p) = @p
danTT(@p)
ada, yaitu, jika@p
secara langsung merupakan argumen ke salah satu ekspresi yang tercantum di awal langkah 2, algoritma pengurangan@p
jenis menyimpulkan jenis data menjadiTT(@p)
. Contohnya:SELECT * FROM t WHERE c1 = @p1 AND @p2 = dbo.tbl(@p3);
Jenis data untuk
@p1
, , dan@p3
akan menjadi jenisc1
data , jenis data pengembalian ,dbo.tbl
dan jenis data parameter untukdbo.tbl
@p2
masing-masing.Sebagai kasus khusus, jika
@p
adalah argumen ke<
operator , ,>
<=
, atau>=
, atau , aturan pengurangan sederhana tidak berlaku. Algoritma pengurangan jenis akan menggunakan aturan pengurangan umum yang dijelaskan di bagian berikutnya. Misalnya, jikac1
adalah kolom karakter tipe data(30), pertimbangkan dua kueri berikut:SELECT * FROM t WHERE c1 = @p; SELECT * FROM t WHERE c1 > @p;
Dalam kasus pertama, algoritma pengurangan jenis menyimpulkan char(30) sebagai jenis data sesuai
@p
aturan sebelumnya dalam artikel ini. Dalam kasus kedua, algoritma pengurangan jenis menyimpulkan varchar (8000) sesuai dengan aturan pengurangan umum di bagian berikutnya.Pengurangan umum
Jika pengurangan sederhana tidak berlaku, jenis data berikut dipertimbangkan untuk parameter yang tidak dinyatakan:
Jenis data bilangan bulat (bit, tinyint, smallint, int, bigint)
Jenis data uang (smallmoney, money)
Jenis data floating-point (float, real)
numerik(38, 19) - Jenis data numerik atau desimal lainnya tidak dipertimbangkan.
varchar(8000), varchar(max), nvarchar(4000), dan nvarchar(max) - Jenis data string lainnya (seperti teks, char(8000), nvarchar(30), dll.) tidak dipertimbangkan.
varbinary(8000) dan varbinary(max) - Jenis data biner lainnya tidak dipertimbangkan (seperti gambar, biner(8000), varbinary(30), dll.).
date, time(7), smalldatetime, datetime, datetime2(7), datetimeoffset(7) - Jenis tanggal dan waktu lainnya, seperti time(4), tidak dipertimbangkan.
aql_variant
xml
Jenis yang ditentukan sistem CLR (hierarkiid, geometri, geografi)
Jenis yang ditentukan pengguna CLR
Kriteria seleksi
Dari jenis data kandidat, tipe data apa pun yang akan membatalkan kueri ditolak. Dari jenis data kandidat yang tersisa, algoritma pengurangan jenis memilih satu sesuai dengan aturan berikut.
Jenis data yang menghasilkan jumlah terkecil konversi implisit dipilih
E(@p)
. Jika jenis data tertentu menghasilkan jenis data yangE(@p)
berbeda dariTT(@p)
, algoritma pengurangan jenis menganggap ini sebagai konversi implisit ekstra dari jenisE(@p)
data keTT(@p)
.Contohnya:
SELECT * FROM t WHERE Col_Int = Col_Int + @p;
Dalam hal ini,
E(@p)
adalahCol_Int + @p
danTT(@p)
int. int dipilih@p
karena tidak menghasilkan konversi implisit. Pilihan jenis data lainnya menghasilkan setidaknya satu konversi implisit.Jika beberapa jenis data mengikat untuk jumlah konversi terkecil, jenis data dengan prioritas yang lebih besar digunakan. Contohnya:
SELECT * FROM t WHERE Col_Int = Col_smallint + @p;
Dalam hal ini, int dan smallint menghasilkan satu konversi. Setiap jenis data lainnya menghasilkan lebih dari satu konversi. Karena int lebih diutamakan daripada smallint, int digunakan untuk
@p
. Untuk informasi selengkapnya tentang prioritas jenis data, lihat Prioritas jenis data.Aturan ini hanya berlaku jika ada konversi implisit antara setiap jenis data yang mengikat sesuai dengan aturan 1 dan jenis data dengan prioritas terbesar. Jika tidak ada konversi implisit, pengurangan jenis data gagal dengan kesalahan. Misalnya dalam kueri
SELECT @p FROM t
, pengurangan jenis data gagal karena jenis@p
data apa pun akan sama baiknya. Misalnya, tidak ada konversi implisit dari int ke xml.Jika dua jenis data serupa mengikat di bawah aturan 1, misalnya varchar(8000) dan varchar(max), jenis data yang lebih kecil (varchar(8000)) dipilih. Prinsip yang sama berlaku untuk jenis data nvarchar dan varbinary .
Untuk tujuan aturan 1, algoritma pengurangan jenis lebih memilih konversi tertentu sebagai lebih baik daripada yang lain. Konversi secara berurutan dari yang terbaik ke terburuk adalah:
- Konversi antara jenis data dasar yang sama dengan panjang yang berbeda.
- Konversi antara versi panjang tetap dan panjang variabel dari jenis data yang sama (misalnya, karakter ke varchar).
- Konversi antara
NULL
dan int. - Konversi lainnya.
Misalnya, untuk kueri SELECT * FROM t WHERE [Col_varchar(30)] > @p
, varchar(8000) dipilih karena konversi (a) adalah yang terbaik. Untuk kueri SELECT * FROM t WHERE [Col_char(30)] > @p
, varchar(8000) masih dipilih karena menyebabkan konversi tipe (b), dan karena pilihan lain (seperti varchar(4000)) akan menyebabkan konversi jenis (d).
Sebagai contoh akhir, diberi kueri SELECT NULL + @p
, int dipilih @p
karena menghasilkan konversi tipe (c).
Izin
Memerlukan izin untuk menjalankan argumen @tsql .
Contoh
Contoh berikut mengembalikan informasi seperti jenis data yang diharapkan untuk parameter dan @name
yang tidak dinyatakan@id
.
EXEC sp_describe_undeclared_parameters @tsql =
N'SELECT object_id, name, type_desc
FROM sys.indexes
WHERE object_id = @id OR name = @name';
@id
Ketika parameter disediakan sebagai @params
referensi, parameter dihilangkan @id
dari kumpulan hasil dan hanya parameter yang @name
dijelaskan.
EXEC sp_describe_undeclared_parameters @tsql =
N'SELECT object_id, name, type_desc
FROM sys.indexes
WHERE object_id = @id OR NAME = @name',
@params = N'@id int';