Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A következőkre vonatkozik:SQL Server
Azure SQL Database
Felügyelt Azure SQL-példány
Azure Synapse Analytics
SQL Analytics-végpont a Microsoft Fabricben
Raktár a Microsoft Fabricben
SQL-adatbázis a Microsoft Fabricben
Olyan eredményhalmazt ad vissza, amely metaadatokat tartalmaz egy Transact-SQL köteg be nem jelentett paramétereiről. A @tsql kötegben használt, de @paramsdeklarált paramétereket veszi figyelembe. A rendszer egy eredményhalmazt ad vissza, amely minden ilyen paraméterhez egy sort tartalmaz, és a paraméter levezetett típusadatait tartalmazza. Az eljárás üres eredményhalmazt ad vissza, ha a @tsql bemeneti kötegnek nincsenek paraméterei, kivéve a @params.
Transact-SQL szintaxis konvenciói
Szintaxis
sp_describe_undeclared_parameters
[ @tsql = ] 'Transact-SQL_batch'
[ , [ @params = ] N'@parameter_name data_type [ , ... n ]' ]
Jegyzet
Ha ezt a tárolt eljárást egy dedikált SQL-készletben szeretné használni az Azure Synapse Analyticsben, állítsa az adatbázis kompatibilitási szintjét 20 vagy magasabbra. A letiltáshoz módosítsa az adatbázis kompatibilitási szintjét 10.
Érvek
Fontos
A kiterjesztett tárolt eljárások argumentumait a Szintaxis szakaszban leírt sorrendben kell megadni. Ha a paraméterek sorrenden kívül vannak beírva, hibaüzenet jelenik meg.
[ @tsql = ] 'tsql'
Egy vagy több Transact-SQL utasítás. @tsql lehet nvarchar(n) vagy nvarchar(max).
[ @params = ] N'@parameter_namedata_type [ ,... n ]'
@params deklarációs sztringet biztosít a Transact-SQL köteg paramétereihez, hasonlóan a sp_executesql működéséhez.
@params lehet nvarchar(n) vagy nvarchar(max).
Egy sztring, amely a @tsqlbeágyazott összes paraméter definícióját tartalmazza. A sztringnek Unicode-állandónak vagy Unicode-változónak kell lennie. Minden paraméterdefiníció egy paraméternévből és egy adattípusból áll.
n egy helyőrző, amely további paraméterdefiníciókat jelez. Ha az utasításban szereplő Transact-SQL utasítás vagy köteg nem tartalmaz paramétereket, @params nincs szükség. A paraméter alapértelmezett értéke NULL.
Kódértékek visszaadása
sp_describe_undeclared_parameters mindig nulla állapotot ad vissza a sikerhez. Ha az eljárás hibát jelez, és az eljárást RPC-nek nevezzük, a visszatérési állapotot az error_typesys.dm_exec_describe_first_result_set oszlopában leírt hibatípus tölti ki. Ha az eljárást Transact-SQL-ből hívjuk meg, a visszatérési érték mindig nulla, még hiba esetén is.
Eredményhalmaz
sp_describe_undeclared_parameters a következő eredményhalmazt adja vissza.
| Oszlop neve | Adattípus | Leírás |
|---|---|---|
parameter_ordinal |
A paraméter sorszámát tartalmazza az eredményhalmazban. Az első paraméter helye 1. Nem null értékű. |
|
name |
sysname | A paraméter nevét tartalmazza. Nem null értékű. |
suggested_system_type_id |
A paraméter adattípusának system_type_id tartalmazza a sys.types.CLR-típusok esetén annak ellenére, hogy a system_type_name oszlop NULLad vissza, ez az oszlop a 240értéket adja vissza. Nem null értékű. |
|
suggested_system_type_name |
nvarchar(256) | Az adattípus nevét tartalmazza. A paraméter adattípusához megadott argumentumokat (például hossz, pontosság, skálázás) tartalmazza. Ha az adattípus egy felhasználó által definiált aliastípus, a mögöttes rendszertípus itt van megadva. Ha ez egy felhasználó által definiált CLR-adattípus, akkor ebben az oszlopban NULL lesz visszaadva. Ha a paraméter típusa nem állapítható meg, NULL lesz visszaadva. Nullázható. |
suggested_max_length |
kis | Lásd: sys.columns.
max_length oszlop leírásához. Nem null értékű. |
suggested_precision |
apró | Lásd: sys.columns. a pontossági oszlop leírásához. Nem null értékű. |
suggested_scale |
apró | Lásd: sys.columns. skálázási oszlop leírásához. Nem null értékű. |
suggested_user_type_id |
CLR- és aliastípusok esetén az oszlop adattípusának user_type_id tartalmazza a sys.types. Ellenkező esetben NULL. Nullázható. |
|
suggested_user_type_database |
sysname | A CLR- és aliastípusok esetében annak az adatbázisnak a nevét tartalmazza, amelyben a típus definiálva van. Ellenkező esetben NULL. Nullázható. |
suggested_user_type_schema |
sysname | A CLR- és aliastípusok esetében annak a sémanak a nevét tartalmazza, amelyben a típus definiálva van. Ellenkező esetben NULL. Nullázható. |
suggested_user_type_name |
sysname | A CLR- és aliastípusok esetében a típus nevét tartalmazza. Ellenkező esetben NULL. |
suggested_assembly_qualified_type_name |
nvarchar(4000) | CLR-típusok esetén a típust meghatározó szerelvény és osztály nevét adja vissza. Ellenkező esetben NULL. Nullázható. |
suggested_xml_collection_id |
A paraméter adattípusának xml_collection_id tartalmazza a sys.columns. Ez az oszlop NULL ad vissza, ha a visszaadott típus nincs XML-sémagyűjteményhez társítva. Nullázható. |
|
suggested_xml_collection_database |
sysname | Azt az adatbázist tartalmazza, amelyben az ehhez a típushoz társított XML-sémagyűjtemény definiálva van. Ez az oszlop NULL ad vissza, ha a visszaadott típus nincs XML-sémagyűjteményhez társítva. Nullázható. |
suggested_xml_collection_schema |
sysname | Azt a sémát tartalmazza, amelyben az ehhez a típushoz társított XML-sémagyűjtemény definiálva van. Ez az oszlop NULL ad vissza, ha a visszaadott típus nincs XML-sémagyűjteményhez társítva. Nullázható. |
suggested_xml_collection_name |
sysname | Az ehhez a típushoz társított XML-sémagyűjtemény nevét tartalmazza. Ez az oszlop NULL ad vissza, ha a visszaadott típus nincs XML-sémagyűjteményhez társítva. Nullázható. |
suggested_is_xml_document |
bit |
1 ad vissza, ha a visszaadott típus XML, és ez a típus garantáltan XML-dokumentum. Ellenkező esetben 0ad vissza. Nem null értékű. |
suggested_is_case_sensitive |
bit |
1 ad vissza, ha az oszlop kis- és nagybetűkre érzékeny sztring típusú, és 0, ha nem. Nem null értékű. |
suggested_is_fixed_length_clr_type |
bit | Visszaadja 1, ha az oszlop rögzített hosszúságú CLR típusú, és 0, ha nem. Nem null értékű. |
suggested_is_input |
bit | Visszaadja 1, ha a paramétert a hozzárendelés bal oldalán kívül máshol használják. Ellenkező esetben 0ad vissza. Nem null értékű. |
suggested_is_output |
bit |
1 ad vissza, ha a paramétert egy hozzárendelés bal oldalán használják, vagy egy tárolt eljárás kimeneti paraméterének továbbítja. Ellenkező esetben 0ad vissza. Nem null értékű. |
formal_parameter_name |
sysname | Ha a paraméter egy tárolt eljárás vagy egy felhasználó által definiált függvény argumentuma, a megfelelő formális paraméter nevét adja vissza. Ellenkező esetben NULLad vissza. Nullázható. |
suggested_tds_type_id |
Belső használatra. Nem null értékű. | |
suggested_tds_length |
Belső használatra. Nem null értékű. |
Megjegyzések
sp_describe_undeclared_parameters mindig nulla állapotot ad vissza.
A leggyakoribb használat az, amikor egy alkalmazás Transact-SQL utasítást kap, amely paramétereket tartalmazhat, és valamilyen módon fel kell őket dolgoznia. Ilyen például egy felhasználói felület (például ODBCTest vagy RowsetViewer), ahol a felhasználó egy ODBC paraméterszintaxisú lekérdezést biztosít. Az alkalmazásnak dinamikusan kell felderítenie a paraméterek számát, és mindegyikre rá kell kérnie a felhasználót.
Egy másik példa az, amikor felhasználói bemenet nélkül az alkalmazásnak át kell hurkolnia a paramétereket, és le kell szereznie az adatokat más helyről (például egy táblából). Ebben az esetben az alkalmazásnak nem kell egyszerre átadnia az összes paraméterinformációt. Ehelyett az alkalmazás lekérheti az összes paraméterinformációt a szolgáltatótól, és maga az adatok is lekérhetők a táblából. A sp_describe_undeclared_parameters használó kód általánosabb, és kisebb valószínűséggel igényel módosítást, ha az adatstruktúra később megváltozik.
sp_describe_undeclared_parameters a következő esetekben hibát ad vissza.
A bemeneti @tsql nem érvényes Transact-SQL köteg. Az érvényességet a Transact-SQL köteg elemzése és elemzése határozza meg. A köteg által a lekérdezés optimalizálása vagy végrehajtása során okozott hibák nem kerülnek figyelembe annak meghatározásakor, hogy a Transact-SQL köteg érvényes-e.
@params nem
NULL, és olyan sztringet tartalmaz, amely nem a paraméterek szintaktikailag érvényes deklarációs sztringje, vagy ha olyan sztringet tartalmaz, amely egynél több paramétert deklarál.A bemeneti Transact-SQL köteg a @paramsparaméterrel azonos nevű helyi változót deklarál.
Az utasítás ideiglenes táblákra hivatkozik.
A lekérdezés tartalmazza a lekérdezett állandó tábla létrehozását.
Ha @tsql a @paramsdeklarált paramétereken kívül nincsenek paraméterei, az eljárás üres eredményhalmazt ad vissza.
Jegyzet
A változót skaláris Transact-SQL változóként kell deklarálnia, vagy hiba jelenik meg.
Paraméterválasztó algoritmus
A be nem jelentett paraméterekkel rendelkező lekérdezések esetében a be nem jelentett paraméterek adattípus-levonása három lépésben halad.
1. lépés: Az alkifejezések adattípusainak megkeresése
A be nem jelentett paraméterekkel rendelkező lekérdezés adattípus-levonásának első lépése az összes olyan alkifejezés adattípusának megkeresése, amelynek adattípusai nem függnek a be nem jelentett paraméterektől. A típus a következő kifejezésekhez határozható meg:
- Oszlopok, állandók, változók és deklarált paraméterek.
- Felhasználó által definiált függvény (UDF) hívásának eredményei.
- Olyan adattípusokkal rendelkező kifejezés, amely nem függ az összes bemenet be nem jelentett paramétereitől.
Vegyük például a lekérdezést SELECT dbo.tbl(@p1) + c1 FROM t1 WHERE c2 = @p2 + 2. A dbo.tbl(@p1) + c1 és c2 kifejezések adattípusokkal rendelkeznek, a kifejezés @p1 és @p2 + 2 nem.
A lépés után, ha bármely kifejezés (nem UDF-hívás) két argumentummal rendelkezik adattípusok nélkül, a típuslevonás hiba miatt meghiúsul. Az alábbi hibák például a következők:
SELECT * FROM t1 WHERE @p1 = @p2;
SELECT * FROM t1 WHERE c1 = @p1 + @p2;
SELECT * FROM t1 WHERE @p1 = SUBSTRING(@p2, 2, 3);
Az alábbi példa nem okoz hibát:
SELECT * FROM t1 WHERE @p1 = dbo.tbl(c1, @p2, @p3);
2. lépés: Legbelső kifejezések keresése
Egy adott be nem jelentett paraméter @pesetében a típuslevonási algoritmus megkeresi az E(@p) tartalmazó legbelső kifejezést @p, és az alábbi argumentumok egyike:
- Egy összehasonlító vagy hozzárendelés-operátor argumentuma.
- Egy felhasználó által definiált függvény argumentuma (beleértve a táblaértékű UDF-t), az eljárást vagy a metódust.
- Egy
VALUESutasításINSERTzáradékának argumentuma. - Argumentum egy
CASTvagyCONVERT.
A típuslevonási algoritmus megkeresi a TT(@p)céladattípusát E(@p). Az előző példák céladattípusai a következők:
- Az összehasonlítás vagy hozzárendelés másik oldalának adattípusa.
- Annak a paraméternek a deklarált adattípusa, amelynek az argumentumot átadja.
- Annak az oszlopnak az adattípusa, amelybe ezt az értéket beszúrja.
- Az az adattípus, amelyre az utasítást öntötte vagy konvertálta.
Vegyük például a lekérdezést SELECT * FROM t WHERE @p1 = dbo.tbl(@p2 + c1). Ezután E(@p1) = @p1, E(@p2) = @p2 + c1, TT(@p1) az dbo.tbldeklarált visszatérési adattípusa, TT(@p2) pedig dbo.tbldeklarált paraméter adattípusa.
Ha @p nem szerepel a 2. lépés elején felsorolt kifejezésekben, a típuslevonási algoritmus megállapítja, hogy E(@p) a legnagyobb skaláris kifejezés, amely @ptartalmaz, és a típuslevonási algoritmus nem számít ki céladattípust TT(@p)E(@p). Ha például a lekérdezés SELECT @p + 2, akkor E(@p) = @p + 2, és nincs TT(@p).
3. lépés: Adattípusok levezetése
A E(@p) és TT(@p) azonosítása után a típuslevonási algoritmus az alábbi két módszer egyikével állapítja meg a @p adattípusát:
Egyszerű levonás
Ha
E(@p) = @pésTT(@p)létezik, vagyis ha@pközvetlenül argumentum a 2. lépés elején felsorolt kifejezések egyikéhez, a típuslevonási algoritmus a@padattípusátTT(@p). Például:SELECT * FROM t WHERE c1 = @p1 AND @p2 = dbo.tbl(@p3);A
@p1,@p2és@p3adattípusa ac1adattípusa, adbo.tblvisszatérési adattípusa, illetve a paraméter adattípusadbo.tbl.Ha a
@pegy<,>,<=vagy>=operátor argumentuma, akkor az egyszerű levonási szabályok nem érvényesek. A típuslevonási algoritmus a következő szakaszban ismertetett általános levonási szabályokat fogja használni. Ha példáulc1adattípusú oszlop, karakter(30), vegye figyelembe a következő két lekérdezést:SELECT * FROM t WHERE c1 = @p; SELECT * FROM t WHERE c1 > @p;Az első esetben a típuslevonási algoritmus karakter(30) az
@padattípusaként, a jelen cikk korábbi szabályainak megfelelően. A második esetben a típuslevonási algoritmus varchar(8000) a következő szakaszban szereplő általános levonási szabályok szerint.Általános levonás
Ha az egyszerű levonás nem alkalmazható, a rendszer a következő adattípusokat veszi figyelembe a be nem jelentett paraméterek esetében:
Egész adattípusok (bit, apró, kis, int, bigint)
Pénz adattípusok (kisvállalati, pénz)
Lebegőpontos adattípusok (lebegőpontos, valós)
numerikus (38, 19) – Más numerikus vagy decimális adattípusok nem tekinthetők meg.
varchar(8000), varchar(max), nvarchar(4000), és nvarchar() max) – Egyéb sztring adattípusok (például szöveges, karakter(8000), nvarchar(30)stb.) nem veszi figyelembe.
varbinary(8000) és varbinary(max) – Más bináris adattípusok nem tekinthetők (például kép, bináris (8000), varbinary(30)stb.).
dátum, idő(7), smalldatetime, datetime, datetime2(7), datetimeoffset(7) – Egyéb dátum- és időtípusok, például idő(4), nem tekinthetők meg.
sql_variant
xml
CLR rendszer által definiált típusok (hierarchiaazonosító, geometria, földrajzi)
Felhasználó által definiált CLR-típusok
Kiválasztási feltételek
A jelölt adattípusok közül minden olyan adattípus, amely érvénytelenné tenné a lekérdezést, a rendszer elutasítja. A fennmaradó jelölt adattípusok közül a típuslevonási algoritmus az alábbi szabályok szerint választ egyet.
Ki van választva az az adattípus, amely a legkisebb számú implicit konverziót állítja elő
E(@p). Ha egy adott adattípus olyan adattípust hoz létre aE(@p)számára, amely eltér aTT(@p)-től, a típuslevonási algoritmus ezt aE(@p)adattípusábólTT(@p)további implicit átalakításnak tekinti.Például:
SELECT * FROM t WHERE Col_Int = Col_Int + @p;Ebben az esetben
E(@p)Col_Int + @pésTT(@p)int. int@p, mert nem hoz létre implicit konverziókat. Bármely más adattípus legalább egy implicit konverziót eredményez.Ha több adattípus köti össze a legkisebb számú konverziót, a rendszer a nagyobb elsőbbséget élvező adattípust használja. Például:
SELECT * FROM t WHERE Col_Int = Col_smallint + @p;Ebben az esetben int és smallint egyetlen konverziót eredményeznek. Minden más adattípus több konverziót is eredményez. Mivel int elsőbbséget élvez kis, int
@p. További információ az adattípus-elsőbbségről: Adattípus elsőbbsége.Ez a szabály csak akkor érvényes, ha az 1. szabálynak megfelelő adattípusok és a legnagyobb elsőbbséget élvező adattípus között implicit konverzió történik. Ha nincs implicit konverzió, az adattípus-levonás hiba miatt meghiúsul. A lekérdezési
SELECT @p FROM tpéldául az adattípus-levonás meghiúsul, mert a@pbármilyen adattípusa egyformán jó lenne. Például nincs implicit átalakítás int-ről xml.Ha az 1. szabály két hasonló adattípust köt össze, például varchar(8000) és varchar(max), akkor a kisebb adattípus (varchar(8000)) lesz kiválasztva. Ugyanez az elv vonatkozik nvarchar és varbináris adattípusokra is.
Az 1. szabály alkalmazásában a típuslevonási algoritmus bizonyos átalakításokat előnyben részesít, mint mások. A legjobbtól a legrosszabbig történő átalakítások a következők:
- Konvertálás azonos, eltérő hosszúságú alapadat-típus között.
- Konvertálás azonos adattípusok rögzített hosszúságú és változó hosszúságú verziója között (például karaktervarchar).
-
NULLés közötti átváltás. - Bármilyen más átalakítás.
A lekérdezés SELECT * FROM t WHERE [Col_varchar(30)] > @ppéldául varchar(8000) van kiválasztva, mert az átalakítás (a) a legjobb. A lekérdezési SELECT * FROM t WHERE [Col_char(30)] > @pesetében a varchar(8000) azért van kiválasztva, mert típus (b) konverziót okoz, és mivel egy másik választás (például varchar(4000)) típuskonvertálást okozna.
Végső példaként egy lekérdezési SELECT NULL + @palapján a @p lesz kiválasztva, mert ez egy (c) típusú konverziót eredményez.
Engedélyek
Engedélyt igényel a @tsql argumentum végrehajtásához.
Példák
Az alábbi példa olyan információkat ad vissza, mint a be nem jelentett @id és @name paraméterek várt adattípusa.
EXECUTE sp_describe_undeclared_parameters @tsql = N'SELECT object_id, name, type_desc
FROM sys.indexes
WHERE object_id = @id OR name = @name';
Ha a @id paraméter @params hivatkozásként van megadva, a @id paraméter ki lesz hagyva az eredményhalmazból, és csak a @name paraméter lesz ismertetve.
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';