Megosztás a következőn keresztül:


sp_describe_undeclared_parameters (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsSQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-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 VALUES utasítás INSERT záradékának argumentuma.
  • Argumentum egy CAST vagy CONVERT.

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 és TT(@p) létezik, vagyis ha @p közvetlenül argumentum a 2. lépés elején felsorolt kifejezések egyikéhez, a típuslevonási algoritmus a @p adattípusát TT(@p). Például:

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

    A @p1, @p2és @p3 adattípusa a c1adattípusa, a dbo.tblvisszatérési adattípusa, illetve a paraméter adattípusa dbo.tbl.

    Ha a @p egy <, >, <=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ául c1 adattí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 @p adattí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.

  1. 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 a E(@p) számára, amely eltér a TT(@p)-től, a típuslevonási algoritmus ezt a E(@p) adattípusából TT(@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 és TT(@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.

  2. 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 @p bármilyen adattípusa egyformán jó lenne. Például nincs implicit átalakítás int-ről xml.

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

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

    1. Konvertálás azonos, eltérő hosszúságú alapadat-típus között.
    2. 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).
    3. NULL és közötti átváltás.
    4. 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';