Sdílet prostřednictvím


sp_describe_first_result_set (Transact-SQL)

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPlatform Platform System (PDW)koncový bod SQL Analytics ve službě Microsoft FabricWarehouse v Microsoft Fabric

Vrátí metadata pro první možnou sadu výsledků dávky Transact-SQL. Vrátí prázdnou sadu výsledků, pokud dávka nevrátí žádné výsledky. Vyvolá chybu, pokud databázový stroj nedokáže určit metadata prvního dotazu, který se spustí provedením statické analýzy. Zobrazení dynamické správy sys.dm_exec_describe_first_result_set vrátí stejné informace.

Transact-SQL konvence syntaxe

Syntax

sp_describe_first_result_set [ @tsql = ] N'tsql'
    [ , [ @params = ] N'@parameter_name data_type [ , ... n ]' ]
    [ , [ @browse_information_mode = ] <tinyint> ]
[ ; ]

Argumenty

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 řetězec deklarace pro parametry pro Transact-SQL dávku, která se podobá sp_executesql. Parametry mohou být nvarchar(n) nebo nvarchar(max).

Řetězec, který obsahuje definice všech parametrů, které jsou vloženy v @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ů. Každý parametr zadaný v příkazu musí být definován v @params. Pokud příkaz Transact-SQL nebo dávka v příkazu neobsahují parametry, @params se nevyžaduje. NULL je výchozí hodnota tohoto parametru.

[ @browse_information_mode = ] tinyint

Určuje, jestli se vrátí další klíčové sloupce a informace o zdrojové tabulce. Pokud je nastavená hodnota 1, každý dotaz se analyzuje, jako by obsahoval možnost FOR BROWSE dotazu.

  • Pokud je nastavená hodnota 0, nevrátí se žádné informace.

  • Pokud je nastavená hodnota 1, každý dotaz se analyzuje, jako by obsahoval možnost FOR BROWSE dotazu. Vrátí se názvy základních tabulek jako informace o zdrojovém sloupci.

  • Pokud je nastavená hodnota 2, každý dotaz se analyzuje, jako by se použil při přípravě nebo spuštění kurzoru. Vrátí se názvy zobrazení jako informace o zdrojovém sloupci.

Návratové hodnoty kódu

sp_describe_first_result_set vždy vrátí stav nuly při úspěchu. Pokud procedura vyvolá chybu a procedura je volána jako RPC, stav návratu je naplněn typem chyby popsané ve sloupci error_type sys.dm_exec_describe_first_result_set. Pokud je procedura volána z Jazyka Transact-SQL, návratová hodnota je vždy nula, i když dojde k chybě.

Sada výsledků

Tato běžná metadata se vrátí jako sada výsledků s jedním řádkem pro každý sloupec v metadatech výsledků. Každý řádek popisuje typ a hodnotu null sloupce ve formátu popsaném v následující části. Pokud první příkaz neexistuje pro každou cestu ovládacího prvku, vrátí se sada výsledků s nulovými řádky.

Název sloupce Datový typ Popis
is_hidden bitová Označuje, že sloupec je další sloupec přidaný pro účely procházení informací a že se ve skutečnosti nezobrazuje v sadě výsledků. Nelze použít hodnotu null.
column_ordinal int Obsahuje pořadové umístění sloupce v sadě výsledků. Pozice prvního sloupce je určena jako 1. Nelze použít hodnotu null.
name sysname Obsahuje název sloupce, pokud lze určit název. V opačném případě obsahuje NULL. Nullable.
is_nullable bitová Obsahuje hodnotu, 1 pokud sloupec umožňuje NULL, 0 pokud sloupec nepovoluje NULL, a 1, pokud sloupec neumožňuje NULL. Nelze použít hodnotu null.
system_type_id int Obsahuje system_type_id datového typu sloupce, jak je uvedeno v sys.types. U typů CLR, i když sloupec system_type_name vrací NULL, vrátí tento sloupec hodnotu 240. Nelze použít hodnotu null.
system_type_name nvarchar(256) Obsahuje název a argumenty (například délku, přesnost, měřítko) určené pro datový typ sloupce. Pokud je datový typ typu alias definovaný uživatelem, je zde uvedený základní systémový typ. Pokud se jedná o uživatelem definovaný typ CLR, NULL se vrátí v tomto sloupci. Nullable.
max_length malé Maximální délka sloupce (v bajtech).

-1 = datový typ sloupec je varchar(max), nvarchar(max), varbinary(max)nebo xml.

U textových sloupců je hodnota max_length16 nebo hodnota nastavená sp_tableoption 'text in row'. Nelze použít hodnotu null.
precision tinyint Přesnost sloupce, pokud je založená na číselném formátu. V opačném případě vrátí 0. Nelze použít hodnotu null.
scale tinyint Měřítko sloupce, pokud je založené na numerickém formátu. V opačném případě vrátí 0. Nelze použít hodnotu null.
collation_name sysname Název kolace sloupce, pokud je založen na znakech. V opačném případě vrátí NULL. Nullable.
user_type_id int U typů CLR a aliasů obsahuje user_type_id datového typu sloupce, jak je uvedeno v sys.types. Jinak je NULL. Nullable.
user_type_database sysname Pro typy CLR a aliasů obsahuje název databáze, ve které je typ definován. Jinak je NULL. Nullable.
user_type_schema sysname U typů CLR a aliasů obsahuje název schématu, ve kterém je typ definován. Jinak je NULL. Nullable.
user_type_name sysname U typů CLR a aliasů obsahuje název typu. Jinak je NULL. Nullable.
assembly_qualified_type_name nvarchar(4000) U typů CLR vrátí název sestavení a třídy definující typ. Jinak je NULL. Nullable.
xml_collection_id int Obsahuje xml_collection_id datového typu sloupce, jak je uvedeno v sys.columns. Tento sloupec vrátí NULL, pokud vrácený typ není přidružen ke kolekci schémat XML. Nullable.
xml_collection_database sysname Obsahuje databázi, ve které je definována kolekce schématu XML přidružená k tomuto typu. Tento sloupec vrátí NULL, pokud vrácený typ není přidružen ke kolekci schémat XML. Nullable.
xml_collection_schema sysname Obsahuje schéma, ve kterém je definována kolekce schémat XML přidružená k tomuto typu. Tento sloupec vrátí NULL, pokud vrácený typ není přidružen ke kolekci schémat XML. Nullable.
xml_collection_name sysname Obsahuje název kolekce schématu XML přidruženou k tomuto typu. Tento sloupec vrátí NULL, pokud vrácený typ není přidružen ke kolekci schémat XML. Nullable.
is_xml_document bitová Vrátí 1, pokud je vrácený datový typ XML a tento typ je zaručen úplný dokument XML (včetně kořenového uzlu), na rozdíl od fragmentu XML. V opačném případě vrátí 0. Nelze použít hodnotu null.
is_case_sensitive bitová Vrátí 1, pokud je sloupec typ řetězce rozlišující velká a malá písmena a 0, pokud tomu tak není. Nelze použít hodnotu null.
is_fixed_length_clr_type bitová Vrátí 1, pokud je sloupec typem CLR s pevnou délkou a 0, pokud tomu tak není. Nelze použít hodnotu null.
source_server sysname Název původního serveru vráceného sloupcem v tomto výsledku (pokud pochází ze vzdáleného serveru). Název je uveden tak, jak se zobrazí v sys.servers. Vrátí NULL, pokud sloupec pochází z místního serveru nebo pokud se nedá určit, na kterém serveru pochází. Je vyplněna pouze v případě, že jsou požadovány informace o procházení. Nullable.
source_database sysname Název původní databáze vrácené sloupcem v tomto výsledku Vrátí NULL, pokud databázi nelze určit. Je vyplněna pouze v případě, že jsou požadovány informace o procházení. Nullable.
source_schema sysname Název původního schématu vráceného sloupcem v tomto výsledku Vrátí NULL, pokud schéma nelze určit. Je vyplněna pouze v případě, že jsou požadovány informace o procházení. Nullable.
source_table sysname Název původní tabulky vrácené sloupcem v tomto výsledku Vrátí NULL, pokud tabulku nelze určit. Je vyplněna pouze v případě, že jsou požadovány informace o procházení. Nullable.
source_column sysname Název původního sloupce vráceného výsledným sloupcem Vrátí NULL, pokud sloupec nelze určit. Je vyplněna pouze v případě, že jsou požadovány informace o procházení. Nullable.
is_identity_column bitová Vrátí 1, pokud je sloupec sloupcem identity a 0, pokud ne. Vrátí NULL, pokud se nedá určit, že sloupec je sloupec identity. Nullable.
is_part_of_unique_key bitová Vrátí 1, pokud je sloupec součástí jedinečného indexu (včetně jedinečného a primárního omezení) a 0, pokud ne. Vrátí NULL, pokud se nedá určit, že je sloupec součástí jedinečného indexu. Vyplněno pouze v případě, že jsou požadovány informace o procházení. Nullable.
is_updateable bitová Vrátí 1, pokud je sloupec aktualizovatelný a pokud ne, 0. Vrátí NULL, pokud se nedá určit, že sloupec je aktualizovatelný. Nullable.
is_computed_column bitová Vrátí 1, pokud je sloupec počítaný sloupec a 0, pokud ne. Vrátí NULL, pokud se nedá určit, že sloupec je počítaný sloupec. Nullable.
is_sparse_column_set bitová Vrátí 1, pokud je sloupec řídkým sloupcem a 0, pokud ne. Vrátí NULL, pokud se nedá určit, že je sloupec součástí řídké sady sloupců. Nullable.
ordinal_in_order_by_list malé Pozice tohoto sloupce v seznamu ORDER BY Vrátí NULL, pokud se sloupec nezobrazí v seznamu ORDER BY nebo pokud ORDER BY seznam nelze jednoznačně určit. Nullable.
order_by_list_length malé Délka seznamu ORDER BY Vrátí NULL, pokud neexistuje žádný seznam ORDER BY nebo pokud seznam ORDER BY nelze jednoznačně určit. Tato hodnota je stejná pro všechny řádky vrácené sp_describe_first_result_set. Nullable.
order_by_is_descending malé Pokud ordinal_in_order_by_list není NULL, sloupec order_by_is_descending hlásí směr klauzule ORDER BY pro tento sloupec. V opačném případě hlásí NULL. Nullable.
tds_type_id int Pro interní použití. Nelze použít hodnotu null.
tds_length int Pro interní použití. Nelze použít hodnotu null.
tds_collation_id int Pro interní použití. Nullable.
tds_collation_sort_id tinyint Pro interní použití. Nullable.

Poznámky

sp_describe_first_result_set zaručuje, že pokud procedura vrátí první metadata sady výsledků pro (hypotetickou) dávku A a pokud je tato dávka (A) následně provedena, dávka buď:

  • vyvolá chybu v době optimalizace.
  • vyvolá chybu za běhu.
  • vrátí žádnou sadu výsledků.
  • vrátí první sadu výsledků se stejnými metadaty popsanými sp_describe_first_result_set

Název, hodnota nullability a datový typ se mohou lišit. Pokud sp_describe_first_result_set vrátí prázdnou sadu výsledků, záruka je, že dávkové spuštění vrátí žádné sady výsledků.

Tato záruka předpokládá, že na serveru nejsou žádné relevantní změny schématu. Relevantní změny schématu na serveru nezahrnují vytvoření dočasných tabulek nebo proměnných tabulek v dávce A mezi dobou volání sp_describe_first_result_set a časem, kdy se sada výsledků vrátí během provádění, včetně změn schématu provedených dávkou B.

sp_describe_first_result_set vrátí chybu v některém z následujících případů:

  • Vstupní @tsql není platná Transact-SQL dávka. Platnost se určuje analýzou a analýzou dávky Transact-SQL. Jakékoli chyby způsobené dávkou při optimalizaci dotazů nebo během provádění se při určování, jestli je dávka Transact-SQL platná, nepovažují.

  • @params není NULL a obsahuje řetězec, který není syntakticky platný řetězec deklarace parametrů nebo obsahuje řetězec, který deklaruje jakýkoli parametr vícekrát.

  • Vstupní Transact-SQL dávka deklaruje místní proměnnou se stejným názvem jako parametr deklarovaný v @params.

  • Příkaz používá dočasnou tabulku.

  • Dotaz zahrnuje vytvoření trvalé tabulky, která se pak dotazuje.

Pokud všechny ostatní kontroly proběhnou úspěšně, považují se za všechny možné cesty toku řízení uvnitř vstupní dávky. To bere v úvahu všechny příkazy toku řízení (GOTO, IF/ELSE, WHILEa Transact-SQL TRY/CATCH bloky) a všechny postupy, dynamické Transact-SQL dávky nebo triggery vyvolané ze vstupní dávky příkazem EXEC, příkazem DDL, který způsobí aktivaci triggerů DDL, nebo příkaz DML, který způsobí aktivaci triggerů v cílové tabulce nebo v tabulce upravené kvůli kaskádové akci na objektu omezení cizího klíče. V určitém okamžiku, stejně jako u mnoha možných řídicích cest, se algoritmus zastaví.

Pro každou cestu toku řízení je první příkaz (pokud existuje), který vrací sadu výsledků, určen sp_describe_first_result_set.

Pokud se v dávce najde více možných prvních příkazů, jejich výsledky se mohou lišit v počtu sloupců, názvu sloupce, možnosti null a datovém typu. Jak se tyto rozdíly zpracovávají, jsou podrobněji popsány tady:

  • Pokud se počet sloupců liší, vyvolá se chyba a nevrátí se žádný výsledek.

  • Pokud se název sloupce liší, je vrácený název sloupce nastaven na NULL.

  • Pokud se hodnota null liší, vrácená možnost null umožňuje NULL.

  • Pokud se datový typ liší, vyvolá se chyba a nevrátí se žádný výsledek s výjimkou následujících případů:

    • varchar(a)varchar(a') kde > a.
    • varchar(a)varchar(max)
    • nvarchar(a)nvarchar(a') kde > a.
    • nvarchar(a) nvarchar(max)
    • varbinary(a)varbinary(a'), kde > a.
    • varbinary(a) varbinary(max)

sp_describe_first_result_set nepodporuje nepřímou rekurzi.

Dovolení

Vyžaduje oprávnění ke spuštění argumentu @tsql.

Příklady

Typické příklady

A. Základní příklad

Následující příklad popisuje sadu výsledků vrácenou z jednoho dotazu.

EXEC sp_describe_first_result_set @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes';

Následující příklad ukazuje sadu výsledků vrácenou z jednoho dotazu, který obsahuje parametr.

EXEC sp_describe_first_result_set @tsql = N'
SELECT object_id, name, type_desc
FROM sys.indexes
WHERE object_id = @id1',
@params = N'@id1 int';

B. Příklady režimu procházení

Následující tři příklady ilustrují klíčový rozdíl mezi různými režimy informací procházení. Do výsledků dotazu se zahrnou jenom relevantní sloupce.

Příklad použití 0označující, že nejsou vráceny žádné informace.

CREATE TABLE dbo.t (
    a INT PRIMARY KEY,
    b1 INT
);
GO

CREATE VIEW dbo.v AS
SELECT b1 AS b2
FROM dbo.t;
GO

EXEC sp_describe_first_result_set N'SELECT b2 AS b3 FROM dbo.v', NULL, 0;

Tady je částečná sada výsledků.

is_hidden column_ordinal Jméno source_schema source_table source_column is_part_of_unique_key
0 1 b3 NULL NULL NULL NULL

Příklad použití 1 označující, že vrací informace, jako by obsahoval možnost FOR BROWSE v dotazu.

EXEC sp_describe_first_result_set N'SELECT b2 AS b3 FROM v', NULL, 1;

Tady je částečná sada výsledků.

is_hidden column_ordinal Jméno source_schema source_table source_column is_part_of_unique_key
0 1 b3 Dbo t B1 0
1 2 a Dbo t a 1

Příklad použití 2 označující analyzované, jako kdybyste připravili kurzor.

EXEC sp_describe_first_result_set N'SELECT b2 AS b3 FROM v', NULL, 2;

Tady je sada výsledků.

is_hidden column_ordinal Jméno source_schema source_table source_column is_part_of_unique_key
0 1 B3 Dbo v B2 0
1 2 ROWSTAT NULL NULL NULL 0

C. Uložení výsledků v tabulce

V některých scénářích je potřeba vložit výsledky sp_describe_first_result_set procedury do tabulky, aby bylo možné schéma dále zpracovat.

Nejprve je potřeba vytvořit tabulku, která odpovídá výstupu sp_describe_first_result_set postupu:

CREATE TABLE #frs (
    is_hidden BIT NOT NULL,
    column_ordinal INT NOT NULL,
    name SYSNAME NULL,
    is_nullable BIT NOT NULL,
    system_type_id INT NOT NULL,
    system_type_name NVARCHAR(256) NULL,
    max_length SMALLINT NOT NULL,
    precision TINYINT NOT NULL,
    scale TINYINT NOT NULL,
    collation_name SYSNAME NULL,
    user_type_id INT NULL,
    user_type_database SYSNAME NULL,
    user_type_schema SYSNAME NULL,
    user_type_name SYSNAME NULL,
    assembly_qualified_type_name NVARCHAR(4000),
    xml_collection_id INT NULL,
    xml_collection_database SYSNAME NULL,
    xml_collection_schema SYSNAME NULL,
    xml_collection_name SYSNAME NULL,
    is_xml_document BIT NOT NULL,
    is_case_sensitive BIT NOT NULL,
    is_fixed_length_clr_type BIT NOT NULL,
    source_server SYSNAME NULL,
    source_database SYSNAME NULL,
    source_schema SYSNAME NULL,
    source_table SYSNAME NULL,
    source_column SYSNAME NULL,
    is_identity_column BIT NULL,
    is_part_of_unique_key BIT NULL,
    is_updateable BIT NULL,
    is_computed_column BIT NULL,
    is_sparse_column_set BIT NULL,
    ordinal_in_order_by_list SMALLINT NULL,
    order_by_list_length SMALLINT NULL,
    order_by_is_descending SMALLINT NULL,
    tds_type_id INT NOT NULL,
    tds_length INT NOT NULL,
    tds_collation_id INT NULL,
    tds_collation_sort_id TINYINT NULL
);

Při vytváření tabulky můžete v této tabulce uložit schéma určitého dotazu.

DECLARE @tsql NVARCHAR(MAX) = 'select top 0 * from sys.credentials';

INSERT INTO #frs
EXEC sys.sp_describe_first_result_set @tsql;

SELECT * FROM #frs;

Příklady problémů

Následující příklady používají dvě tabulky pro všechny příklady. Spuštěním následujících příkazů vytvořte ukázkové tabulky.

CREATE TABLE dbo.t1 (
    a INT NULL,
    b VARCHAR(10) NULL,
    c NVARCHAR(10) NULL
);

CREATE TABLE dbo.t2 (
    a SMALLINT NOT NULL,
    d VARCHAR(20) NOT NULL,
    e INT NOT NULL
);

Chyba, protože počet sloupců se liší

Počet sloupců v možných prvních sadách výsledků se v tomto příkladu liší.

EXEC sp_describe_first_result_set @tsql = N'
IF (1 = 1)
    SELECT a FROM t1;
ELSE
    SELECT a, b FROM t1;

SELECT * FROM t; -- Ignored, not a possible first result set.';

Chyba, protože se datové typy liší

Typy sloupců se liší v různých možných prvních sadách výsledků.

EXEC sp_describe_first_result_set @tsql = N'
IF (1 = 1)
    SELECT a FROM t1;
ELSE
    SELECT a FROM t2;';

Výsledkem je chyba neshod typů (int vs. smallint).

Název sloupce nelze určit.

Sloupce v možných prvních sadách výsledků se liší délkou pro stejný typ proměnné, hodnotu nullability a názvy sloupců:

EXEC sp_describe_first_result_set @tsql = N'
IF (1 = 1)
    SELECT b FROM t1;
ELSE
    SELECT d FROM t2;';

Tady je částečná sada výsledků.

Sloupec Hodnota
name Neznámý název sloupce
system_type_name varchar
max_length 20
is_nullable 1

Název sloupce vynucený být identický prostřednictvím aliasingu

Stejné jako v předchozím případě, ale sloupce mají stejný název prostřednictvím aliasů sloupců.

EXEC sp_describe_first_result_set @tsql = N'
IF (1 = 1)
    SELECT b FROM t1;
ELSE
    SELECT d AS b FROM t2;';

Tady je částečná sada výsledků.

Sloupec Hodnota
name b
system_type_name varchar
max_length 20
is_nullable 1

Chyba, protože typy sloupců se nedají spárovat

Typy sloupců se liší v různých možných prvních sadách výsledků.

EXEC sp_describe_first_result_set @tsql = N'
IF (1 = 1)
    SELECT b FROM t1;
ELSE
    SELECT c FROM t1;';

Výsledkem je chyba neshod typů (varchar(10) vs. nvarchar(10)).

Sada výsledků může vrátit chybu.

První sada výsledků je buď chyba, nebo sada výsledků.

EXEC sp_describe_first_result_set @tsql = N'
IF (1 = 1)
    RAISERROR(''Some Error'', 16 , 1);
ELSE
    SELECT a FROM t1;
SELECT e FROM t2; -- Ignored, not a possible first result set.';

Tady je částečná sada výsledků.

Sloupec Hodnota
name a
system_type_name int
is_nullable 1

Některé cesty kódu nevrací žádné výsledky.

První sada výsledků je null nebo sada výsledků.

EXEC sp_describe_first_result_set @tsql = N'
IF (1 = 1)
    RETURN;
SELECT a FROM t1;';

Tady je částečná sada výsledků.

Sloupec Hodnota
name a
system_type_name int
is_nullable 1

Výsledek z dynamického SQL

První sada výsledků je dynamická sql, která je zjistitelná, protože se jedná o řetězec literálu.

EXEC sp_describe_first_result_set @tsql = N'
EXEC(N''SELECT a FROM t1'');';

Tady je částečná sada výsledků.

Sloupec Hodnota
name a
system_type_name int
is_nullable 1

Selhání výsledku z dynamického SQL

První sada výsledků není definována kvůli dynamickému SQL.

EXEC sp_describe_first_result_set @tsql = N'
DECLARE @SQL NVARCHAR(max);
SET @SQL = N''SELECT a FROM t1 WHERE 1 = 1'';
IF (1 = 1)
    SET @SQL += N'' AND e > 10'';
EXEC(@SQL);';

Výsledkem je chyba. Výsledek není zjistitelný kvůli dynamickému SQL.

Sada výsledků zadaná uživatelem

První sada výsledků je určena uživatelem ručně.

EXEC sp_describe_first_result_set @tsql =
N'
DECLARE @SQL NVARCHAR(max);
SET @SQL = N''SELECT a FROM t1 WHERE 1 = 1'';
IF (1 = 1)
    SET @SQL += N'' AND e > 10'';
EXEC(@SQL)
    WITH RESULT SETS (
        (Column1 BIGINT NOT NULL)
    );';

Tady je částečná sada výsledků.

Sloupec Hodnota
name Column1
system_type_name bigint
is_nullable 0

Chyba způsobená nejednoznačným souborem výsledků

Tento příklad předpokládá, že jiný uživatel s názvem user1 má tabulku s názvem t1 ve výchozím schématu s1 se sloupci (a int NOT NULL).

EXEC sp_describe_first_result_set @tsql = N'
    IF (@p > 0)
    EXECUTE AS USER = ''user1'';
    SELECT * FROM t1;',
@params = N'@p int';

Výsledkem tohoto kódu je chyba Invalid object name. t1 může být dbo.t1 nebo s1.t1, každý s jiným počtem sloupců.

Výsledek i s nejednoznačnými sadami výsledků

Použijte stejné předpoklady jako v předchozím příkladu.

EXEC sp_describe_first_result_set @tsql =
N'
    IF (@p > 0)
    EXECUTE AS USER = ''user1'';
    SELECT a FROM t1;';

Tady je částečná sada výsledků.

Sloupec Hodnota
name a
system_type_name int
is_nullable 1

dbo.t1.a i s1.t1.a mají typ inta jinou hodnotu nullability.