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.
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.
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.
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.
İ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.
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:
Farklı uzunlukta aynı temel veri türü arasında dönüştürme.
Sabit uzunluk ve değişken uzunlukta sürümü aynı veri türleri arasında dönüştürme (örn., chariçin varchar).
Arasında dönüştürme NULLve int.
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)