Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Microsoft Fabric'te
SQL analitiği uç noktasıMicrosoft Fabric'te
DepoMicrosoft Fabric'te SQL veritabanı
Transact-SQL bir partide bildirilmemiş parametrelerle ilgili meta veri içeren bir sonuç kümesi döndürür. @tsql partisinde kullanılan ancak @params'de ilan edilmemiş her parametreyi dikkate alır. Her böyle parametre için bir satır içeren bir sonuç kümesi döndürülür ve bu parametre için çıkarılan tür bilgisi bulunur. Prosedür, @tsql girdi partisinde @params'de ilan edilen parametreler dışında parametreler yoksa, boş bir sonuç kümesi döndürür.
Transact-SQL söz dizimi kuralları
Sözdizimi
sp_describe_undeclared_parameters
[ @tsql = ] 'Transact-SQL_batch'
[ , [ @params = ] N'@parameter_name data_type [ , ... n ]' ]
Uyarı
Azure Synapse Analytics'te bu saklanan prosedürü özel bir SQL havuzunda kullanmak için veritabanı uyumluluk seviyesini veya 20 daha yüksek bir seviyeye ayarlayın. Çıkmak için veritabanı uyumluluk seviyesini .10
Arguments
Önemli
Genişletilmiş saklı yordamlar için bağımsız değişkenler, Sözdizimi bölümünde açıklandığı gibi belirli bir sırada girilmelidir. Parametreler sıra dışı girilirse bir hata iletisi oluşur.
[ @tsql = ] 'tsql'
Bir veya daha fazla Transact-SQL deyimi. @tsqlnvarchar(n) veya nvarchar(max)olabilir.
[ @params = ] N'@parameter_namedata_type [ ,... n ]'
@params , Transact-SQL partisi için parametreler için bir bildirme dizisi sağlar, sp_executesql benzer şekilde işleniyor.
@paramsnvarchar(n) veya nvarchar(max) olabilir.
@tsql'de gömülü tüm parametrelerin tanımlarını içeren bir dizidir. Dize bir Unicode sabiti veya Unicode değişkeni olmalıdır. Her parametre tanımı bir parametre adından ve bir veri türünden oluşur.
n, ek parametre tanımlarını gösteren bir yer tutucudur. deyimindeki Transact-SQL deyimi veya toplu işlemi parametre içermiyorsa @params gerekli değildir. Bu parametre için varsayılan değerdir NULL.
Dönüş kodu değerleri
sp_describe_undeclared_parameters başarı durumunda her zaman sıfır durumunu döndürür. Prosedür hata yaparsa ve prosedür RPC olarak çağrılırsa, dönüş durumu sütununda sys.dm_exec_describe_first_result_settanımlanan error_type hata türüyle doldurulur. İşlem Transact-SQL'den çağrılırsa, hata durumlarında bile dönüş değeri her zaman sıfırdır.
Sonuç kümesi
sp_describe_undeclared_parameters aşağıdaki sonuç kümesini döndürür.
| Sütun adı | Veri türü | Description |
|---|---|---|
parameter_ordinal |
int | Sonuç kümesindeki parametrenin sırasal konumunu içerir. İlk parametrenin konumu olarak belirtilir.1 Null değeri atanamaz. |
name |
sysname | Parametrenin adını içerir. Null değeri atanamaz. |
suggested_system_type_id |
int | Parametrenin system_type_id veri türünün içinde belirtildiği sys.typesşekilde bulunur.CLR türleri için, sütun system_type_name döndürse NULLbile, bu sütun değerini 240döndürür. Null değeri atanamaz. |
suggested_system_type_name |
nvarchar(256) | Veri tipi adını içerir. Parametrenin veri tipi için belirlenen argümanları (uzunluk, hassasiyet, ölçek gibi) içerir. Veri tipi kullanıcı tanımlı bir takma ad türüyse, altta yatan sistem tipi burada belirtilmiştir. Eğer CLR kullanıcı tanımlı veri türüyse, NULL bu sütunda döner. Parametrenin türü çıkarılamazsa, NULL geri döner. Nullable. |
suggested_max_length |
smallint | Bkz. sys.columns. sütun açıklaması için max_length . Null değeri atanamaz. |
suggested_precision |
tinyint | Bkz. sys.columns. Hassas sütun açıklaması için. Null değeri atanamaz. |
suggested_scale |
tinyint | Bkz. sys.columns. ölçek sütunu açıklaması için. Null değeri atanamaz. |
suggested_user_type_id |
int | CLR ve alias türleri için, user_type_id sütunun veri tipinin 'de belirtildiği sys.typesgibi. Aksi takdirde NULL. Nullable. |
suggested_user_type_database |
sysname | CLR ve alias türleri için, türün tanımlandığı veritabanının adını içerir. Aksi takdirde NULL. Nullable. |
suggested_user_type_schema |
sysname | CLR ve alias türleri için, türün tanımlandığı şemanın adını içerir. Aksi takdirde NULL. Nullable. |
suggested_user_type_name |
sysname | CLR ve alias türleri için, türün adını içerir. Aksi takdirde NULL. |
suggested_assembly_qualified_type_name |
nvarchar(4000) | CLR tipleri için, tipi tanımlayan assembly ve sınıfın adını döndürür. Aksi takdirde NULL. Nullable. |
suggested_xml_collection_id |
int | Parametrenin xml_collection_id veri türünün içinde belirtildiği sys.columnsşekilde bulunur. Bu sütun, döndürülen tip bir XML şema koleksiyonuyla ilişkilendirilmiyorsa döner NULL . Nullable. |
suggested_xml_collection_database |
sysname | Bu tiple ilişkili XML şema koleksiyonunun tanımlandığı veritabanını içerir. Bu sütun, döndürülen tip bir XML şema koleksiyonuyla ilişkilendirilmiyorsa döner NULL . Nullable. |
suggested_xml_collection_schema |
sysname | Bu tiple ilişkili XML şema koleksiyonunun tanımlandığı şemayı içerir. Bu sütun, döndürülen tip bir XML şema koleksiyonuyla ilişkilendirilmiyorsa döner NULL . Nullable. |
suggested_xml_collection_name |
sysname | Bu tiple ilişkili XML şema koleksiyonunun adını içerir. Bu sütun, döndürülen tip bir XML şema koleksiyonuyla ilişkilendirilmiyorsa döner NULL . Nullable. |
suggested_is_xml_document |
bit |
1 Geri dönen tip XML ise ve bu tip kesinlikle bir XML belge olarak kabul edilir. Aksi takdirde 0döndürür. Null değeri atanamaz. |
suggested_is_case_sensitive |
bit | Sütun büyük harf duyarlı bir dizide ve 0 değilse döner1. Null değeri atanamaz. |
suggested_is_fixed_length_clr_type |
bit | Sütun sabit uzunlukta CLR tipindeyse ve 0 değildirse döndürür1. Null değeri atanamaz. |
suggested_is_input |
bit | Parametre bir atamanın sol tarafı dışında kullanılırsa döner 1 . Aksi takdirde 0döndürür. Null değeri atanamaz. |
suggested_is_output |
bit | Parametre bir atamanın sol tarafında kullanılırsa veya depolanmış bir prosedürün çıktı parametresine aktarılırsa döner 1 . Aksi takdirde 0döndürür. Null değeri atanamaz. |
formal_parameter_name |
sysname | Parametre bir saklanan prosedürün argümanı veya kullanıcı tanımlı bir fonksiyon ise, karşılık gelen biçimsel parametrenin adını döndürür. Aksi takdirde NULLdöndürür. Nullable. |
suggested_tds_type_id |
int | Dahili kullanım için. Null değeri atanamaz. |
suggested_tds_length |
int | Dahili kullanım için. Null değeri atanamaz. |
Açıklamalar
sp_describe_undeclared_parameters Her zaman sıfır durumunu döndürür.
En yaygın kullanım, bir uygulamaya parametreler içeren ve bunları bir şekilde işlemesi gereken Transact-SQL bir ifade verildiğinde kullanılır. Örneğin, kullanıcı ODBC parametre sözdizimi ile bir sorgu sunan bir kullanıcı arayüzü (örneğin ODBCTest veya RowsetViewer) olabilir. Uygulama, parametre sayısını dinamik olarak keşfetmeli ve kullanıcıya her biri için soru sormalıdır.
Bir diğer örnek ise, kullanıcı girdisi olmadığında, uygulama parametreleri döngüye atıp verileri başka bir konumdan (örneğin bir tablodan) elde etmek zorundadır. Bu durumda, uygulama tüm parametre bilgilerini aynı anda aktarmak zorunda değildir. Bunun yerine, uygulama tüm parametre bilgilerini sağlayıcıdan alabilir ve verileri kendisinden tablodan alabilir. Kod kullanımı sp_describe_undeclared_parameters daha genel ve veri yapısı ileride değişirse değişiklik gerektirmemesi daha az olur.
sp_describe_undeclared_parameters aşağıdaki durumlardan herhangi birinde hata döndürür.
Giriş @tsql geçerli bir Transact-SQL partisi değil. Geçerlilik, Transact-SQL partisinin ayrıştırılması ve analiz edilmesiyle belirlenir. Sorgu optimizasyonu sırasında veya yürütme sırasında toplu hatalar nedeniyle oluşan hatalar, Transact-SQL partisinin geçerli olup olmadığına karar verirken dikkate alınmaz.
@params değildir
NULLve parametreler için sözdizimsel olarak geçerli bir bildirme dizisi olmayan bir diziye veya herhangi bir parametreyi birden fazla kez bildiren bir diziye sahip varsa içerir.Girdi Transact-SQL partisi, @params'de ilan edilen bir parametreyle aynı adlı yerel bir değişkeni belirtir.
Bu ifade geçici tablolara atıfta bulunuyor.
Sorgu, kalıcı bir tablo oluşturulmasını içerir ve bu tablo sorgulanır.
Eğer @tsql@params'de bildirilen parametreler dışında parametre yoksa, prosedür boş bir sonuç kümesi döndürür.
Uyarı
Değişkeni skaler Transact-SQL değişken olarak ilan etmelisiniz, aksi takdirde bir hata ortaya çıkar.
Parametre seçme algoritması
Belirtilmemiş parametrelere sahip bir sorgu için, bildirilmemiş parametreler için veri türü çıkarımı üç adımda ilerler.
Adım 1: Alt ifadelerin veri tiplerini bulun
Bildirilmemiş parametrelere sahip bir sorgu için veri tipi çıkarımında ilk adım, veri tipleri bildirilmemiş parametrelere bağlı olmayan tüm alt ifadelerin veri tiplerini bulmaktır. Tip aşağıdaki ifadeler için belirlenebilir:
- Sütunlar, sabitler, değişkenler ve bildirilmiş parametreler.
- Kullanıcı tanımlı bir fonksiyona (UDF) yapılan çağrının sonuçları.
- Tüm girdiler için bildirilmemiş parametrelere bağlı olmayan veri tiplerine sahip bir ifade.
Örneğin, sorguyu SELECT dbo.tbl(@p1) + c1 FROM t1 WHERE c2 = @p2 + 2ele alalım. ve c2 ifadelerinin dbo.tbl(@p1) + c1 veri tipleri vardır, ifade @p1 ve @p2 + 2 yoktur.
Bu adımdan sonra, herhangi bir ifadede (UDF çağrısı dışında) veri tipleri olmayan iki argüman varsa, tür çıkarımı hatayla başarısız olur. Örneğin, aşağıdakilerin hepsi hatalara yol açar:
SELECT * FROM t1 WHERE @p1 = @p2;
SELECT * FROM t1 WHERE c1 = @p1 + @p2;
SELECT * FROM t1 WHERE @p1 = SUBSTRING(@p2, 2, 3);
Aşağıdaki örnek hata yaratmaz:
SELECT * FROM t1 WHERE @p1 = dbo.tbl(c1, @p2, @p3);
Adım 2: En içsel ifadeleri bulun
Verilen bir bildirilmemiş parametre @piçin, tür çıkarım algoritması aşağıdaki argümanlardan birini içeren @p en içsel ifadeyi E(@p) bulur:
- Bir karşılaştırma veya atama operatörüne argüman.
- Kullanıcı tanımlı bir fonksiyona (tablo değerli UDF dahil), prosedür veya metod argümanı.
- Bir
INSERTifadenin birVALUESmaddesine argüman. - Bir argüman, bir
CASTveyaCONVERT.
Tür çıkarım algoritması, için E(@p)hedef veri tipi TT(@p) bulur. Önceki örnekler için hedef veri türleri şunlardır:
- Karşılaştırmanın veya atamanın diğer tarafındaki veri türü.
- Bu argümanın iledildiği parametrenin bildirilen veri tipi.
- Bu değerin girildiği sütunun veri tipi.
- Cümlenin döküm veya dönüştürüldüğü veri türü.
Örneğin, sorguyu SELECT * FROM t WHERE @p1 = dbo.tbl(@p2 + c1)ele alalım. O zaman E(@p1) = @p1, E(@p2) = @p2 + c1, TT(@p1) , için dbo.tblbildirilen dönüş veri tipidir ve TT(@p2) için dbo.tblbildirilen parametre veri tipidir.
Eğer @p 2. adımın başında listelenen herhangi bir ifadede yer almıyorsa, tür çıkarım algoritması bunun E(@p) en büyük skaler ifadeyi içerdiğini @pve tür çıkarım algoritması için E(@p)hedef veri TT(@p) tipini hesaplamadığını belirler. Örneğin, sorgu SELECT @p + 2 ise E(@p) = @p + 2ve TT(@p)yoksa.
Adım 3: Veri türlerini çıkar
Şimdi E(@p) ve TT(@p) tanımlandığında, tür çıkarım algoritması aşağıdaki iki yoldan biriyle bir veri türünü çıkarır @p :
Basit çıkarım
Eğer
E(@p) = @pveTT(@p)varsa, yani@peğer 2. adımın başında listelenen ifadelerden birine doğrudan bir argüman ise, tür çıkarım algoritması veri tipini@pşu şekildeTT(@p)çıkarır. Örneğin:SELECT * FROM t WHERE c1 = @p1 AND @p2 = dbo.tbl(@p3);,
@p2, vec1@p3için veri@p1tipi, için veri tipi , döndürmedbo.tblveri tipi ve parametredbo.tblveri tipi olacaktır.Özel bir durum olarak,
@peğer bir<,>,<=, veya>=operatöre argüman ise, basit çıkarım kuralları uygulanmaz. Tür çıkarım algoritması, bir sonraki bölümde açıklanan genel çıkarım kurallarını kullanacaktır. Örneğin,c1eğer veri tipi char(30) sütunuysa, aşağıdaki iki sorguyu düşünelim:SELECT * FROM t WHERE c1 = @p; SELECT * FROM t WHERE c1 > @p;İlk durumda, tür çıkarım algoritması, bu makalenin önceki kurallarına göre char (30) veri tipi
@polarak çıkarır. İkinci durumda, tür çıkarım algoritması varchar(8000) 'yi sonraki bölümdeki genel çıkarım kurallarına göre çıkarır.Genel çıkarım
Basit çıkarım uygulanmıyorsa, bildirilmemiş parametreler için aşağıdaki veri türleri dikkate alınır:
Tamsayı veri türleri (bit, tinyint, smallint, int, bigint)
Para veri türleri (smallmoney, money)
Kayan nokta veri türleri (float, real)
numeric(38, 19) - Diğer sayısal veya ondalık veri türleri dikkate alınmaz.
varchar(8000), varchar(max), nvarchar(4000) ve nvarchar(max) - Diğer dizi veri türleri ( örneğin metin, char(8000), nvarchar(30) vb.) dikkate alınmaz.
varbinary(8000) ve varbinary(max) - Diğer ikili veri türleri dikkate alınmaz ( örneğin image, binary(8000), varbinary(30) vb.).
date, time(7), smalldatetime, datetime, datetime2(7), datetimeoffset(7) - Diğer tarih ve saat türleri, örneğin time(4) dikkate alınmaz.
sql_variant
xml
CLR sistem tanımlı tipler (hiyerarşi, geometri, coğrafya)
CLR kullanıcı tanımlı türler
Seçim ölçütleri
Aday veri tiplerinde, sorguyu geçersiz kılacak herhangi bir veri türü reddedilir. Kalan aday veri tiplerinden, tür çıkarım algoritması aşağıdaki kurallara göre birini seçer.
İçinde
E(@p)en az örtük dönüşüm üreten veri türü seçilir. Belirli bir veri türü, farklı bir veriE(@p)türü için bir veri tipi üretirse, tür çıkarım algoritması bunu 'E(@p)nin veri tipinden 'yeTT(@p)ekstra örtük bir dönüşüm olarak kabulTT(@p)eder.Örneğin:
SELECT * FROM t WHERE Col_Int = Col_Int + @p;Bu durumda,
E(@p)olCol_Int + @pveTT(@p)int'dir. INT , örtük dönüşüm yapmadığı için seçilir@p. Başka herhangi bir veri türü seçimi en az bir örtük dönüşüm üretir.En az dönüşüm sayısı için birden fazla veri türü eşitlenirse, daha öncelikli veri türü kullanılır. Örneğin:
SELECT * FROM t WHERE Col_Int = Col_smallint + @p;Bu durumda, int ve smallint tek dönüşüm üretir. Diğer tüm veri türleri birden fazla dönüşüm üretir. Intsmallint'e göre öncelikli olduğundan, int için
@pkullanılır. Veri tipi önceliği hakkında daha fazla bilgi için bkz. Veri tipi önceliği.Bu kural, yalnızca kural 1'e göre bağlanan her veri türü ile en büyük önceliğe sahip veri türü arasında örtük bir dönüşüm varsa geçerlidir. Eğer örtük bir dönüşüm yoksa, veri türü çıkarımı hatayla başarısız olur. Örneğin, sorguda
SELECT @p FROM t, veri türü çıkarımı başarısız olur çünkü herhangi bir veri türü için@peşit derecede iyi olur. Örneğin, zekâdanxml'ye örtük bir dönüşüm yok.Eğer iki benzer veri tipi kural 1'e göre eşitlenirse, örneğin varchar(8000) ve varchar(max), daha küçük veri tipi (varchar(8000)) seçilir. Aynı prensip nvarchar ve varbinary veri tipleri için de geçerlidir.
Kural 1 kapsamında, tür çıkarım algoritması bazı dönüşümleri diğerlerinden daha iyi olarak tercih eder. En iyiden en kötüye dönüşümler şunlardır:
- Farklı uzunlukta aynı temel veri türü arasında dönüşüm.
- Aynı veri türlerinin sabit uzunluklu ve değişken uzunluklu versiyonları arasında dönüşüm (örneğin, char ile varchar).
- Int
NULLile arasında dönüşüm. - Başka bir dönüşüm.
Örneğin, sorgu SELECT * FROM t WHERE [Col_varchar(30)] > @piçin varchar(8000) seçilir çünkü dönüşüm (a) en iyisidir. Sorgu SELECT * FROM t WHERE [Col_char(30)] > @piçin, varchar(8000) hala seçilir çünkü bu tür (b) dönüşümüne yol açar ve başka bir seçenek (örneğin varchar(4000)) tip (d) dönüşümüne yol açar.
Son bir örnek olarak, bir sorgu SELECT NULL + @pverildiğinde, int@p için seçilir çünkü bu tür (c) dönüşümü ile sonuçlanır.
Permissions
@tsql argümanını çalıştırmak için izin gerektirir.
Örnekler
Aşağıdaki örnek, bildirilmemiş @id veri türü ve @name parametreler gibi bilgileri geri getirir.
EXECUTE sp_describe_undeclared_parameters @tsql = N'SELECT object_id, name, type_desc
FROM sys.indexes
WHERE object_id = @id OR name = @name';
Parametre @id referans olarak sağlandığında @params , @id parametre sonuç kümesinden çıkarılır ve sadece parametre @name tanımlanır.
EXECUTE 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';