Aracılığıyla paylaş


sp_describe_undeclared_parameters (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft 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 NULL ve 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 INSERT ifadenin bir VALUES maddesine argüman.
  • Bir argüman, bir CAST veya CONVERT.

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) = @p ve TT(@p) varsa, yani @p eğ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 şekilde TT(@p)çıkarır. Örneğin:

    SELECT * FROM t WHERE c1 = @p1 AND @p2 = dbo.tbl(@p3);
    

    , @p2, ve c1@p3 için veri @p1tipi, için veri tipi , döndürme dbo.tblveri tipi ve parametre dbo.tbl veri tipi olacaktır.

    Özel bir durum olarak, @p eğ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, c1 eğ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 @p olarak çı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.

  1. İçinde E(@p) en az örtük dönüşüm üreten veri türü seçilir. Belirli bir veri türü, farklı bir veri E(@p) türü için bir veri tipi üretirse, tür çıkarım algoritması bunu 'E(@p)nin veri tipinden 'ye TT(@p)ekstra örtük bir dönüşüm olarak kabul TT(@p)eder.

    Örneğin:

    SELECT * FROM t WHERE Col_Int = Col_Int + @p;
    

    Bu durumda, E(@p) ol Col_Int + @p ve TT(@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.

  2. 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 @p eşit derecede iyi olur. Örneğin, zekâdanxml'ye örtük bir dönüşüm yok.

  3. 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.

  4. 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:

    1. Farklı uzunlukta aynı temel veri türü arasında dönüşüm.
    2. Aynı veri türlerinin sabit uzunluklu ve değişken uzunluklu versiyonları arasında dönüşüm (örneğin, char ile varchar).
    3. Int NULL ile arasında dönüşüm.
    4. 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';