Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance
Azure SQLAzure Synapse Analytics
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databáze SQL v Microsoft Fabric
Vrací sadu výsledků, která obsahuje metadata o nedeklarovaných parametrech v Transact-SQL dávce. Zvažuje každý parametr, který je použit v @tsql dávce, ale není deklarován v @params. Je vrácena výsledná množina, která obsahuje jeden řádek pro každý takový parametr s odvozenou informací o typu pro tento parametr. Procedura vrací prázdnou množinu výsledků, pokud @tsql vstupní dávka nemá žádné parametry kromě těch deklarovaných v @params.
Syntaxe
sp_describe_undeclared_parameters
[ @tsql = ] 'Transact-SQL_batch'
[ , [ @params = ] N'@parameter_name data_type [ , ... n ]' ]
Poznámka:
Pro použití tohoto uloženého postupu v Azure Synapse Analytics v dedikovaném SQL poolu nastavte úroveň kompatibility databáze na 20 nebo vyšší. Pro odhlášení změňte úroveň kompatibility databáze na 10.
Arguments
Důležité
Argumenty rozšířených uložených procedur musí být zadány v určitém pořadí, jak je popsáno v části Syntaxe. Pokud jsou parametry zadány mimo pořadí, dojde k chybové zprávě.
[ @tsql = ]tsql
Jeden nebo více příkazů Transact-SQL. @tsql může být nvarchar(n) nebo nvarchar(max).
[ @params = ] N'@parameter_namedata_type [ ,... n ]'
@params poskytuje deklarační řetězec pro parametry pro Transact-SQL dávku, podobně jako sp_executesql to funguje.
@params může být nvarchar(n) nebo nvarchar(max).
Řetězec obsahující definice všech parametrů vložených do @tsql. Řetězec musí být buď konstanta Unicode, nebo proměnná Unicode. Každá definice parametru se skládá z názvu parametru a datového typu.
n je zástupný symbol označující další definice parametrů. Pokud příkaz Transact-SQL nebo dávka v příkazu neobsahují parametry, @params se nevyžaduje. Výchozí hodnota pro tento parametr je NULL.
Hodnoty návratového kódu
sp_describe_undeclared_parameters vždy se při úspěchu vrací stav nula. Pokud procedura vyhodí chybu a procedura je volána jako RPC, stav návratu je vyplněn typem chyby popsaným ve sloupci error_type .sys.dm_exec_describe_first_result_set Pokud je procedura volána z Transact-SQL, vrácená hodnota je vždy nulová, i v případech chyb.
Sada výsledků
sp_describe_undeclared_parameters vrátí následující sadu výsledků.
| Název sloupce | Datový typ | Description |
|---|---|---|
parameter_ordinal |
int | Obsahuje ordinální pozici parametru ve výsledné množině. Pozice prvního parametru je určena jako 1. Není nulovatelný. |
name |
sysname | Obsahuje název parametru. Není nulovatelný. |
suggested_system_type_id |
int | Obsahuje z system_type_id datového typu parametru, jak je specifikován v sys.types.Pro typy CLR, i když sloupec system_type_name vrací NULL, tento sloupec vrací hodnotu 240. Není nulovatelný. |
suggested_system_type_name |
nvarchar(256) | Obsahuje název datového typu. Zahrnuje argumenty (jako délka, přesnost, měřítko) určené pro datový typ parametru. Pokud je datový typ uživatelem definovaný alias typ, zde je specifikován základní typ systému. Pokud jde o uživatelsky definovaný typ dat CLR, NULL je vrácen v tomto sloupci. Pokud nelze odvodit typ parametru, vrátí se. NULL Nullable. |
suggested_max_length |
smallint | Viz sys.columns. pro max_length popis sloupce. Není nulovatelný. |
suggested_precision |
tinyint | Viz sys.columns. pro přesný popis sloupců. Není nulovatelný. |
suggested_scale |
tinyint | Viz sys.columns. pro popis stupnice sloupce. Není nulovatelný. |
suggested_user_type_id |
int | Pro typy CLR a alias, obsahuje z user_type_id datového typu sloupce, jak je specifikováno v .sys.types Jinak je NULL. Nullable. |
suggested_user_type_database |
sysname | Pro typy CLR a alias, obsahuje název databáze, ve které je typ definován. Jinak je NULL. Nullable. |
suggested_user_type_schema |
sysname | Pro CLR a aliasové typy obsahuje název schématu, ve kterém je typ definován. Jinak je NULL. Nullable. |
suggested_user_type_name |
sysname | Pro CLR a aliasy obsahuje název typu. Jinak je NULL. |
suggested_assembly_qualified_type_name |
nvarchar(4000) | Pro CLR typy vrací název assembleru a třídu, která typ definuje. Jinak je NULL. Nullable. |
suggested_xml_collection_id |
int | Obsahuje z xml_collection_id datového typu parametru, jak je specifikován v sys.columns. Tento sloupec vrátí, NULL pokud vrácený typ není přiřazen ke sbírce XML schématu. Nullable. |
suggested_xml_collection_database |
sysname | Obsahuje databázi, ve které je definována XML kolekce schémat spojená s tímto typem. Tento sloupec vrátí, NULL pokud vrácený typ není přiřazen ke sbírce XML schématu. Nullable. |
suggested_xml_collection_schema |
sysname | Obsahuje schéma, ve kterém je definována XML kolekce schémat spojená s tímto typem. Tento sloupec vrátí, NULL pokud vrácený typ není přiřazen ke sbírce XML schématu. Nullable. |
suggested_xml_collection_name |
sysname | Obsahuje název kolekce XML schématu spojeného s tímto typem. Tento sloupec vrátí, NULL pokud vrácený typ není přiřazen ke sbírce XML schématu. Nullable. |
suggested_is_xml_document |
bit | Vrátí, 1 pokud je vrácený typ XML a tento typ je zaručeně XML dokument. V opačném případě vrátí 0. Není nulovatelný. |
suggested_is_case_sensitive |
bit | Vrátí, 1 pokud je sloupec typu řetězce citlivého na velikost písmen a 0 pokud není. Není nulovatelný. |
suggested_is_fixed_length_clr_type |
bit | Vrátí, 1 pokud je sloupec typu CLR s pevnou délkou a 0 pokud není. Není nulovatelný. |
suggested_is_input |
bit | Vrátí, 1 pokud je parametr použit jinde než na levé straně přiřazení. V opačném případě vrátí 0. Není nulovatelný. |
suggested_is_output |
bit | Vrátí, 1 pokud je parametr použit na levé straně přiřazení nebo je předán výstupnímu parametru uložené procedury. V opačném případě vrátí 0. Není nulovatelný. |
formal_parameter_name |
sysname | Pokud je parametr argumentem uložené procedury nebo uživatelem definované funkce, vrátí název odpovídajícího formálního parametru. V opačném případě vrátí NULL. Nullable. |
suggested_tds_type_id |
int | Pro interní použití. Není nulovatelný. |
suggested_tds_length |
int | Pro interní použití. Není nulovatelný. |
Poznámky
sp_describe_undeclared_parameters vždy vrací stav nula.
Nejčastější použití je, když aplikace dostane Transact-SQL příkaz, který může obsahovat parametry a musí je nějakým způsobem zpracovat. Příkladem je uživatelské rozhraní (například ODBCTest nebo RowsetViewer), kde uživatel zadá dotaz se syntaxí parametrů ODBC. Aplikace musí dynamicky zjišťovat počet parametrů a vyzvat uživatele na každý z nich.
Dalším příkladem je, když aplikace bez vstupu uživatele musí projít parametry a získat data z jiného místa (například tabulky). V tomto případě aplikace nemusí předávat všechny informace parametrů najednou. Místo toho může aplikace získat všechny parametry od poskytovatele a data sama získat z tabulky. Používání sp_describe_undeclared_parameters kódu je obecnější a méně pravděpodobně bude vyžadovat úpravy, pokud se později změní datová struktura.
sp_describe_undeclared_parameters vrací chybu v kterémkoli z následujících případů.
Vstupní @tsql není platná Transact-SQL šarže. Platnost se určuje parsováním a analýzou Transact-SQL dávky. Chyby způsobené dávkou během optimalizace dotazu nebo během provádění nejsou při určování platnosti Transact-SQL dávky zohledněny.
@params není
NULLa obsahuje řetězec, který není syntakticky platným deklaračním řetězcem pro parametry, nebo pokud obsahuje řetězec, který deklaruje jakýkoli parametr více než jednou.Vstupní Transact-SQL batch deklaruje lokální proměnnou stejného jména jako parametr deklarovaný v @params.
Prohlášení odkazuje na dočasné tabulky.
Dotaz zahrnuje vytvoření trvalé tabulky, která je následně dotazována.
Pokud @tsql nemá žádné parametry kromě parametrů deklarovaných v @params, procedura vrátí prázdnou množinu výsledků.
Poznámka:
Musíte proměnnou deklarovat jako skalární Transact-SQL proměnné, jinak se objeví chyba.
Algoritmus výběru parametrů
Pro dotaz s nedeklarovanými parametry probíhá dedukce datového typu pro nedeklarované parametry ve třech krocích.
Krok 1: Najděte datové typy podvýrazů
Prvním krokem při odvozu datových typů pro dotaz s nedeklarovanými parametry je najít datové typy všech podvýrazů, jejichž datové typy nezávisí na nedeklarovaných parametrech. Typ lze určit pro následující výrazy:
- Sloupce, konstanty, proměnné a deklarované parametry.
- Výsledky volání uživatelsky definované funkce (UDF).
- Výraz s datovými typy, které nezávisí na nedeklarovaných parametrech pro všechny vstupy.
Například uvažujme dotaz SELECT dbo.tbl(@p1) + c1 FROM t1 WHERE c2 = @p2 + 2. Výrazy dbo.tbl(@p1) + c1 a c2 mají datové typy, a výrazy @p1 a @p2 + 2 ne.
Po tomto kroku, pokud má jakýkoli výraz (kromě volání UDF) dva argumenty bez datových typů, dedukce typů selže chybou. Například následující všechny způsobují chyby:
SELECT * FROM t1 WHERE @p1 = @p2;
SELECT * FROM t1 WHERE c1 = @p1 + @p2;
SELECT * FROM t1 WHERE @p1 = SUBSTRING(@p2, 2, 3);
Následující příklad nevytváří chybu:
SELECT * FROM t1 WHERE @p1 = dbo.tbl(c1, @p2, @p3);
Krok 2: Najděte nejvnitřnější výrazy
Pro daný nedeklarovaný parametr @palgoritmus typu dedukce najde nejvnitřnější výraz E(@p) , který obsahuje @p a je jedním z následujících argumentů:
- Argument vůči operátoru srovnání nebo přiřazení.
- Argument k uživatelsky definované funkci (včetně tabulkově hodnotové UDF), procedurě nebo metodě.
- Argument k větě
VALUESvýrokuINSERT. - Argument k nebo
CASTCONVERT.
Algoritmus dedukce typů najde cílový datový typ TT(@p) pro E(@p). Cílové datové typy pro předchozí příklady jsou následující:
- Typ dat na druhé straně porovnání nebo přiřazení.
- Deklarovaný datový typ parametru, na který je tento argument předán.
- Datový typ sloupce, do kterého je tato hodnota vložena.
- Typ dat, na který se tvrzení převádí nebo převádí.
Například uvažujme dotaz SELECT * FROM t WHERE @p1 = dbo.tbl(@p2 + c1). Pak , , je deklarovaný typ návratových dat , dbo.tbla TT(@p2) je deklarovaný datový typ parametru pro dbo.tbl. TT(@p1)E(@p2) = @p2 + c1E(@p1) = @p1
Pokud @p není obsažen v žádném výrazu uvedeném na začátku kroku 2, algoritmus pro dedukci typů určí, že E(@p) je největším skalárním výrazem, který obsahuje @p, a algoritmus pro výpočet typu nepočítá cílový datový typ TT(@p) pro E(@p). Například pokud je dotaz , SELECT @p + 2 pak E(@p) = @p + 2, a neexistuje .TT(@p)
Krok 3: Odvodit datové typy
Nyní, když E(@p) jsou a identifikovány TT(@p) , algoritmus dedukce typů odvodí datový typ pro @p jedním z následujících dvou způsobů:
Jednoduchá dedukce
Pokud
E(@p) = @paTT(@p)existuje, tedy pokud@pje přímo argumentem k jednomu z výrazů uvedených na začátku kroku 2, algoritmus dedukce typu odvozí datový typ .@pTT(@p)Například:SELECT * FROM t WHERE c1 = @p1 AND @p2 = dbo.tbl(@p3);Datový typ pro
@p1, , a@p3bude datovým typemc1, návratovým datovým typemdbo.tbl, a parametrovým datovým typem pro .dbo.tbl@p2Jako speciální případ, pokud
@pje argument k ,<>,<=, nebo>=operátoru, jednoduchá pravidla dedukce se neuplatňují. Algoritmus pro dedukci typů bude používat obecná pravidla dedukce vysvětlená v následující sekci. Například pokudc1je sloupec datového typu char(30), zvažme následující dva dotazy:SELECT * FROM t WHERE c1 = @p; SELECT * FROM t WHERE c1 > @p;V prvním případě algoritmus dedukce typů odvodí char (30) jako datový typ pro podle
@ppravidel uvedených dříve v tomto článku. Ve druhém případě algoritmus typové dedukce odvozuje varchar(8000) podle obecných dedukčních pravidel v následující sekci.Obecná dedukce
Pokud se jednoduchá dedukce neuplatní, pro nedeklarované parametry se zvažují následující datové typy:
Celočíselné datové typy (bit, tinyint, smallint, int, bigint)
Typy dat o penězích (smallmoney, money)
Typy dat s plovoucí desetinnou čárkou (plovoucí, reálné)
numerické(38, 19) - Jiné číselné nebo desetinné datové typy nejsou brány v úvahu.
varchar(8000), varchar(max),nvarchar(4000) a nvarchar(max) - Další datové typy řetězců (například text, char(8000), nvarchar(30)) atd.) nejsou zohledněny.
varbinary(8000) a varbinary(max) – Jiné binární datové typy nejsou brány v úvahu (například image, binary(8000), varbinary(30) atd.).
date, time(7),smalldatetime, datetime, datetime2(7), datetimeoffset(7) - Jiné typy dat a času, jako time(4), nejsou brány v potaz.
sql_variant
xml
CLR systémem definované typy (hierarchyid, geometrie, geografie)
Uživatelem definované typy CLR
Kritéria výběru
Z kandidátních datových typů je jakýkoli datový typ, který by dotaz zneplatnil, odmítnut. Z ostatních kandidátních datových typů vybere algoritmus dedukce jeden podle následujících pravidel.
Je vybrán datový typ, který produkuje nejmenší počet implicitních převodů v .
E(@p)Pokud konkrétní datový typ vytváří datový typ proE(@p), který je odlišný odTT(@p), algoritmus dedukce typů považuje tento typ za další implicitní převod z datového typu doE(@p)TT(@p).Například:
SELECT * FROM t WHERE Col_Int = Col_Int + @p;V tomto případě
E(@p)je aCol_Int + @pTT(@p)je int. int je zvolen pro proto@p, že nevytváří implicitní konverze. Jakákoli jiná volba datového typu vede alespoň k jedné implicitní konverzi.Pokud se více datových typů shoduje na nejmenším počtu převodů, použije se datový typ s vyšší prioritou. Například:
SELECT * FROM t WHERE Col_Int = Col_smallint + @p;V tomto případě int a smallint vedou k jedné konverzi. Každý jiný datový typ produkuje více než jednu konverzi. Protože int má přednost před smallint, int se používá pro
@p. Pro více informací o přednosti datových typů viz Data Type prioritence.Toto pravidlo platí pouze tehdy, pokud existuje implicitní převod mezi každým datovým typem, který se váže podle pravidla 1, a datovým typem s největší předností. Pokud nedochází k implicitní konverzi, pak odečtení datového typu selže s chybou. Například v dotazu
SELECT @p FROM t, odečítání datového typu selže, protože jakýkoli datový typ pro@pby byl stejně dobrý. Například neexistuje implicitní převod z int do xml.Pokud jsou podle pravidla 1 stejné dva podobné datové typy, například varchar(8000) a varchar(max), je zvolen menší datový typ (varchar(8000)). Stejný princip platí pro nvarchar a varbinární datové typy.
Pro účely pravidla 1 algoritmus pro výpočet typů preferuje určité převody jako lepší než jiné. Převody v pořadí od nejlepšího po nejhorší jsou:
- Převod mezi stejným základním datovým typem různé délky.
- Převod mezi verzí stejných datových typů s pevnou délkou a proměnnou délkou (například char na varchar).
- Převod mezi
NULLa inteligencí. - Jakákoli jiná konverze.
Například pro dotaz SELECT * FROM t WHERE [Col_varchar(30)] > @pje varchar(8000) zvolen, protože konverze (a) je nejlepší. Pro dotaz SELECT * FROM t WHERE [Col_char(30)] > @pje varchar(8000) stále zvolen, protože způsobuje konverzi typu (b) a protože jiná volba (například varchar(4000)) by způsobila konverzi typu (d).
Jako poslední příklad, pro dotaz SELECT NULL + @p, je int zvoleno pro @p to, že vede k převodu typu (c).
Povolení
Vyžaduje povolení k provedení @tsql argumentu.
Examples
Následující příklad vrací informace, jako je očekávaný datový typ pro nedeklarované @id a @name parametry.
EXECUTE sp_describe_undeclared_parameters @tsql = N'SELECT object_id, name, type_desc
FROM sys.indexes
WHERE object_id = @id OR name = @name';
Když je parametr @id uveden jako @params reference, parametr @id je z výsledné množiny vynechán a popisován je pouze parametr.@name
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';