Share via


sp_describe_undeclared_parameters (Transact-sql)

Bildirilmemiş parametreleriyle ilgili meta verileri içeren bir sonuç kümesi döndüren bir Transact-SQLtoplu. Kullanılan her parametre dikkate @ tsql toplu iş, ama değil de bildirilen @ params. Bu parametre deduced türü bilgileri her tür parametresi için bir satır içeren bir sonuç kümesi döndürülür. Yordam döndürür bir boş sonuç kümesi if @ tsql giriş toplu olan bu ilan dışında herhangi bir parametre @ params.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

sp_describe_undeclared_parameters 
    [ @tsql = ] 'Transact-SQL_batch' 
    [ , [ @params = ] N'parameters' data type ] [, ...n]

Bağımsız değişkenler

  • @tsql = 'Transact-SQL_batch'
    Bir veya daha fazla Transact-SQLdeyimleri. Transact-SQL_batch may be nvarchar(n) or nvarchar(max).

  • @params = n'parameters'
    @ params sağlar bir bildiri dize parametreleri için Transact-SQLbenzer şekilde sp_executesql için toplu işleri. Parametersmay be nvarchar(n) or nvarchar(max).

    İçinde katıştırılmış tüm parametreleri tanımları içeren bir dizedir Transact-SQL_batch. Unicode sabit ya da değişken Unicode dize olmalıdır. Her parametre tanımı, parametre adı ve veri türü oluşur. n ek parametre tanımları gösteren bir yer tutucudur. Transact-sql deyimini veya toplu iş içinde deyim parametreleri içermiyorsa, @ params gerekli değildir. Bu parametre için varsayılan değer null olur.

  • Veri türü
    Parametre veri türü.

Dönüş Kodu Değerleri

sp_describe_undeclared_parameters her zaman sıfır başarı durumunu döndürür dönmek. Yordamı bir hata atar ve yordamı bir rpc adlandırılır, döndürülen durum hata türüne göre error_type sütununda açıklandığı gibi doldurulur sys.dm_exec_describe_first_result_set. Yordam dan çağrılırsa Transact-SQL, dönüş değeri her zaman, hata durumlarda bile sıfırdır.

Sonuç Kümeleri

sp_describe_undeclared_parameters aşağıdaki sonuç kümesi döndürür.

Sütun adı

Veri türü

Açıklama

parameter_ordinal

int NOT NULL

Sonuç kümesi parametresi sıralı konumunu içerir. İlk parametre konumunu 1 olarak belirlenir.

name

sysname NOT NULL

Parametrenin adını içerir.

suggested_system_type_id

int NOT NULL

İçeren system_type_id belirtilen parametre veri türü sys.types.

clr türleri, olsa bile system_type_name sütun null dönecektir, bu sütunun değeri 240 döndürür.

suggested_system_type_name

nvarchar (256) NULL

Veri türü adı içerir. Parametre veri türü için belirtilen bağımsız değişken (örneğin, uzunluk, duyarlık, ölçek) içerir. Veri türü kullanıcı tanımlı ad türü ise, temeldeki sistem türü burada belirtilir. clr kullanıcı tanımlı veri türü ise, bu sütunda null döndürdü. Parametre türü olamaz deduced, null döndürülür.

suggested_max_length

smallint NOT NULL

See sys.columns. için max_length sütun açıklaması.

suggested_precision

tinyint NOT NULL

See sys.columns. hassas sütun açıklaması.

suggested_scale

tinyint NOT NULL

See sys.columns. Ölçek sütun açıklaması.

suggested_user_type_id

int NULL

clr türleri için diğer ad, belirtilen sütun veri türü user_type_id bulunmaktadır sys.types. Aksi takdirde null olur.

suggested_user_type_database

sysname NULL

clr ve türleri için diğer ad türü tanımlandığı veritabanı adını içerir. Aksi takdirde null olur.

suggested_user_type_schema

sysname NULL

clr ve türleri için diğer ad türü tanımlandığı şemasının adını içerir. Aksi takdirde null olur.

suggested_user_type_name

sysname NULL

clr ve türleri için diğer ad türünün adını içerir. Aksi takdirde null olur.

suggested_assembly_qualified_type_name

nvarchar (4000) NULL

clr türleri için montaj ve türünü tanımlayan sınıf ismini döndürür. Aksi takdirde null olur.

suggested_xml_collection_id

int NULL

Belirtilen parametre veri türüne xml_collection_id içeren sys.columns. Döndürülen türü xml Şeması derlemesi ile ilişkili değilse bu sütun null döndürür.

suggested_xml_collection_database

sysname NULL

Bu türüyle ilişkili xml şema koleksiyonu tanımlandığı veritabanı içerir. Döndürülen türü xml Şeması derlemesi ile ilişkili değilse bu sütun null döndürür.

suggested_xml_collection_schema

sysname NULL

Bu türüyle ilişkili xml şema koleksiyonu içinde tanımlanan şema içerir. Döndürülen türü xml Şeması derlemesi ile ilişkili değilse bu sütun null döndürür.

suggested_xml_collection_name

sysname NULL

Bu türüyle ilişkili xml şema koleksiyonu adı bulunur. Döndürülen türü xml Şeması derlemesi ile ilişkili değilse bu sütun null döndürür.

suggested_is_xml_document

bit NOT NULL

Döndürülen xml türüdür ve bu tür bir xml belgesi olması sağlanır 1 döndürür. Aksi takdirde 0 döndürür.

suggested_is_case_sensitive

bit NOT NULL

1, Değilse 0 ve büyük küçük harf duyarlı dize türü sütun ise döner.

suggested_is_fixed_length_clr_type

bit NOT NULL

1, Değilse 0 ve sabit uzunluklu clr türü sütun ise döner.

suggested_is_input

bit NOT NULL

Parametre ise 1 döner her yerde başka bir atamanın sol tarafında kullanılır. Aksi takdirde 0 döndürür.

suggested_is_output

bit NOT NULL

Parametre bir atamanın sol tarafında kullanılan ya da bir saklı yordam için bir çıkış parametresi geçirilen 1 döndürür. Aksi takdirde 0 döndürür.

formal_parameter_name

sysname NULL

Parametresi bir saklı yordam veya kullanıcı tanımlı bir işlev bağımsız değişkeni ise, ilgili biçimsel parametre adını döndürür. Aksi takdirde null döndürür.

suggested_tds_type_id

int NOT NULL

Dahili kullanım için.

suggested_tds_length

int NOT NULL

Dahili kullanım için.

Açıklamalar

sp_describe_undeclared_parameters her zaman sıfır durumunu döndürür dönmek.

Uygulama verildiğinde en yaygın kullanımı olan bir Transact-SQLdeyimi parametreler içerebilir ve onları bir şekilde işleyen gerekir. Burada kullanıcı bir sorgu ile odbc parametre sözdizimini sağlar bir kullanıcı arabirimi (örneğin, ODBCTest veya RowsetViewer) buna bir örnektir. Uygulama dinamik parametre sayısını keşfetmek ve her biri için kullanıcıdan gerekir.

Başka bir örnek olmadan kullanıcı girişi olduğunda, uygulama parametreleri üzerinde döngü ve veriler için başka bir konuma (örneğin, tablo) almak gerekir. Bu durumda, uygulama tüm parametre bilgilerini bir kez geçmek zorunda değil. Bunun yerine, uygulama sağlayıcıdan tüm parametre bilgilerini almak ve veri tablosundan elde edilir. Kullanarak kod sp_describe_undeclared_parameters daha geneldir ve veri yapısı değişiklikleri daha sonra değiştirilmesi gerekir daha düşüktür.

sp_describe_undeclared_parameters aşağıdaki durumların hiçbirinde, bir hata döndürür.

  • Giriş @ tsql geçerli değilse, Transact-SQLtoplu. Geçerlilik belirlenen ayrıştırma ve analiz Transact-SQLtoplu. Sorgu en iyi duruma getirme veya yürütme sırasında toplu işi tarafından neden hataları belirlerken dikkate alınmaz mı Transact-SQLtoplu geçerli.

  • @ Params null olmayan bir dize içeriyorsa, bu bildirimi sözdizimi kurallarına göre geçerli dize parametreleri için değil veya bir dize içeriyorsa, birden çok kez herhangi bir parametre bildirir.

  • Eğer giriş Transact-SQLtoplu @ params içinde bildirilmiş bir parametre olarak aynı adlı bir yerel değişken ilan etti.

  • Eğer herhangi bir geçici tablo deyimi oluşturur.

@ Tsql parametre varsa, dışında bu ilan @ params içinde yordam, bir boş sonuç kümesi döndürür.

Parametre seçimi algoritması

Bildirilmemiş parametreler ile bir sorgu için veri türü kesinti bildirilmemiş parametreler için üç adımda devam eder.

Adım 1

Veri türü kesinti bildirilmemiş parametreler ile bir sorgu için ilk adımı olan veri türleri bildirilmemiş parametrelere bağlı olmayan tüm sub-expressions veri türlerini bulmaktır. Türü için aşağıdaki ifadeler belirlenebilir:

  • Sütunlar, sabitler, değişkenler ve bildirilen parametreleri.

  • Kullanıcı tanımlı bir işlev (udf) için arama sonuçları.

  • Bir ifade ile tüm girişleri için bildirilmemiş parametrelere bağlı olmayan veri türleri.

Örneğin, sorgu göz önünde bulundurun SELECT dbo.tbl(@p1) + c1 FROM t1 WHERE c2 = @p2 + 2. Veri türlerine sahip ifadeler dbo.tbl(@p1) + c1 ve c2 ve ifade @ p1 ve p2 @ + 2 yok.

Herhangi bir ifade (dışında bir udf çağrısı) iki bağımsız değişken olmadan veri türleri varsa bu adımdan sonra türü indirimi bir hata ile başarısız olur. Örneğin, aşağıdaki tüm hataları üretimiyle:

SELECT * FROM t1 WHERE @p1 = @p2
SELECT * FROM t1 WHERE c1 = @p1 + @p2
SELECT * FROM t1 WHERE @p1 = SUBSTRING(@p2, 2, 3)

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 bir hata üretmek değildir:

SELECT * FROM t1 WHERE @p1 = dbo.tbl(c1, @p2, @p3)

SELECT * FROM t1 WHERE @p1 = dbo.tbl(c1, @p2, @p3)

Adım 2

Verilen bildirilmemiş parametre @ p, içteki ifade @ p içerir ve bunlardan birini E(@p) türü kesinti algoritma bulur:

  • Bir bağımsız değişken için bir karşılaştırma veya atama işleci.

  • Bir kullanıcı tanımlı işlevi (tablo deerli udf dahil), yordam veya yöntem bağımsız değişkeni.

  • Bağımsız değişkeni bir VALUESyan tümcesi bir INSERTdeyimi.

  • Bağımsız değişkeni bir CASTya CONVERT.

Türü kesinti algoritması, E(@p) için hedef veri türü TT(@p) bulur. Hedef veri türleri için yukarıdaki örnekler aşağıdaki gibidir:

  • Diğer tarafta karşılaştırma veya atama veri türü.

  • Bildirilen veri türü parametresi için bu bağımsız değişken aktarılır.

  • Bu değer takılabileceği sütun veri türü.

  • Veri türü için deyim döküm veya dönüştürme.

Örneğin, sorgu göz önünde bulundurun SELECT * FROM t WHERE @p1 = dbo.tbl(@p2 + c1). Sonra E(@p1) @ p1, E(@p2) = @ p2 = + c1 TT(@p1) dbo.tbl bildirilen dönüş veri türü ve TT(@p2) bildirilen parametre veri türü için dbo.tbl.

@ P adım 2 başında listelenen herhangi bir ifade yer alıyor türü kesinti algoritma E(@p) @ p içeren büyük skalar ifade ve türü kesinti algoritma hedef veri türü TT(@p) E(@p) için hesaplaması yapmıyor olduğunu belirler. Örneğin, sorgunun select ise @p + 2sonra E(@p) = @ p + 2, ve orada'hayır TT(@p).

Adım 3

Şimdi, E(@p) ve TT(@p) tespit türü kesinti algoritma bir veri türü @ p aşağıdaki iki yoldan birini deduces:

  • Basit kesinti

    If E(@p) = @ p ve TT(@p) var, yani eğer doğrudan bir bağımsız değişken bir adım 2, türü kesinti algoritma başında listelenen ifadeler @ p TT(@p) için veri türü deduces @ p. Örneğin:

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

    Veri türü için @ p1, p2 @ ve @ p3 c1, dbo.tbl dönüş veri türü ve dbo.tbl için parametre veri türü veri türü sırasıyla olacaktır.

    @ P bağımsız değişkeni ise özel bir durum olarak bir <, >, <= ya da >= işleci, basit kesinti kuralları uygulanmaz. Sonraki bölümde açıklanan genel kesinti kuralları türü kesinti algoritması kullanır. Örneğin, C1 sütun veri türü char(30) ise, aşağıdaki iki sorgu göz önünde bulundurun:

    SELECT * FROM t WHERE c1 = @p
    SELECT * FROM t WHERE c1 > @p
    
    SELECT * FROM t WHERE c1 = @p
    SELECT * FROM t WHERE c1 > @p
    

    İlk durumda, türü kesinti algoritma deduces char(30)@ p için bu konunun önceki bölümlerinde yer alan kurallara göre veri türü olarak. İkinci durumda, türü kesinti algoritma deduces varchar(8000)sonraki bölümde genel kesinti kurallarına göre.

  • Genel kesinti

    Basit kesinti uygulanmaz, aşağıdaki veri türleri için bildirilmemiş parametreleri kabul edilir:

    • Integer data types (bit, tinyint, smallint, int, bigint)

    • Money veri türleri (smallmoney, money)

    • Kayan nokta veri türleri (float, real)

    • numeric(38, 19)-Diğer sayısal ve ondalık veri türleri dikkate alınmaz.

    • varchar(8000), varchar(max), nvarchar(4000), ve nvarchar(max)- diğer dize veri türlerini (örneğin text, char(8000), nvarchar(30), vb) kabul edilmez.

    • varbinary(8000)ve varbinary(max) -diğer ikili veri türlerini kabul (örneğin image, binary(8000), varbinary(30), vs.).

    • date, time(7), smalldatetime, datetime, datetime2(7), datetimeoffset(7)- Diğer Tarih ve saat türleri, gibi time(4), dikkate alınmaz.

    • sql_variant

    • xml

    • Sistem tanımlı clr türleri (hierarchyid, geometry, geography)

    • clr kullanıcı tanımlı türler

Seçim kriterleri

Aday veri türleri, herhangi bir veri türü sorgu kılacak reddedilir. Kalan aday veri türleri, türü kesinti algoritması aşağıdaki kurallara uygun şekilde seçer.

  1. Veri türüne örtük dönüştürmeler E(@p) sayısı üreten seçilir. Belirli veri türü için TT(@p) farklı E(@p) bir veri türü oluyorsa, türü kesinti algoritma bunu TT(@p) E(@p) veri türü bir ekstra örtük dönüştürme olarak değerlendirmektedir.

    Örneğin:

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

    Bu durumda, E(@p) Col_Int + @ p ve TT(@p) int. intçünkü hiçbir örtük dönüştürmeler üretir @ p için seçilir. Başka bir seçenek veri türünün en az bir örtük dönüştürme üretir.

  2. Birden çok veri türü dönüştürmeleri en küçük sayıyı için kravat, daha yüksek önceliğe sahip veri türü kullanılır. Örneğin

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

    Bu durumda, intve smallintbir dönüşüm üretmek. Her veri türü birden fazla dönüşüm üretir. Çünkü intönceliklidir smallint, int@ s. için kullanılır Veri türü önceliği hakkında daha fazla bilgi için bkz: Veri türü önceliği (Transact-sql).

    Bir kapalı dönüştürme kural 1 göre bağlar her veri türü ve veri türü ile en büyük önceliği arasında ise yalnızca bu kural geçerlidir. Örtük dönüştürme ise, veri türü kesintinin bir hata ile başarısız olur. Örneğin sorguda SELECT @p FROM t, veri türü kesinti başarısız çünkü herhangi bir veri türü için @ p-cekti var olmak aynı derecede iyi. Örneğin, orada'hayır örtük dönüştürme intiçin xml.

  3. İki benzer veri türleri altında kural 1, kravat, örneğin varchar(8000) ve varchar(max), daha küçük veri türü (varchar(8000)) seçilir. Aynı ilke geçerlidir nvarcharve varbinaryveri türlerini.

  4. Kural 1 amacıyla, belirli dönüşümleri diğerlerinden daha iyi olarak türü kesinti algoritması tercih ediyor. İyi kötü için sırayla dönüşümler şunlardır:

    1. Farklı uzunlukta aynı temel veri türü arasında dönüştürme.

    2. Sabit uzunluk ve değişken uzunlukta sürümü aynı veri türleri arasında dönüştürme (örn., chariçin varchar).

    3. Arasında dönüştürme NULLve int.

    4. Diğer dönüştürme.

Örneğin sorgu SELECT * FROM t WHERE [Col_varchar(30)] > @p, varchar(8000)dönüştürme (a) iyi olduğu için seçildi. Sorgu için SELECT * FROM t WHERE [Col_char(30)] > @p, varchar(8000)tipi (b) dönüşüm neden olduğu ve çünkü hala seçtiğiniz başka bir seçenek (gibi varchar(4000)) türü (d) dönüşüm neden olur.

Son bir örnek, bir sorgu verilen SELECT NULL + @p, intbir türü (c) dönüşüm sonuçları çünkü @ p seçilir.

İzinler

@ Tsql bağımsız yürütme izni gerektirir.

Örnekler

Aşağıdaki örnek, bildirilmemiş beklenen veri türü gibi bilgiler verir @idve @nameparametreleri.

sp_describe_undeclared_parameters @tsql = 
N'SELECT object_id, name, type_desc 
FROM sys.indexes
WHERE object_id = @id OR name = @name'

sp_describe_undeclared_parameters @tsql = 
N'SELECT object_id, name, type_desc 
FROM sys.indexes
WHERE object_id = @id OR name = @name'

Ne zaman @idparametre olarak sağlanan bir @paramsreferans, @idsonuç kümesi ve tek parametre belirtilmemişse @nameparametre açıklanan.

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'

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'

Ayrıca bkz.

Başvuru

sp_describe_first_result_set (Transact-sql)

sys.dm_exec_describe_first_result_set (Transact-sql)

sys.dm_exec_describe_first_result_set_for_object (Transact-sql)