Udostępnij za pomocą


sp_describe_first_result_set (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricHurtownia danych w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Zwraca metadane dla pierwszego możliwego zestawu wyników partii Transact-SQL. Zwraca pusty zestaw wyników, jeśli partia nie zwraca żadnych wyników. Zgłasza błąd, jeśli aparat bazy danych nie może określić metadanych dla pierwszego zapytania, które zostanie wykonane przez przeprowadzenie analizy statycznej. Dynamiczny widok zarządzania sys.dm_exec_describe_first_result_set zwraca te same informacje.

Transact-SQL konwencje składni

Składnia

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

Argumenty (w programowaniu)

Ważne

Argumenty dla rozszerzonych procedur składowanych należy wprowadzić w określonej kolejności zgodnie z opisem w sekcji składni. Jeśli parametry są wprowadzane poza kolejnością, wystąpi komunikat o błędzie.

[ @tsql = ] 'tsql'

Co najmniej jedna instrukcja Transact-SQL. @tsql może być nvarchar(n) lub nvarchar(max).

[ @params = ] N'@parameter_name data_type [ , ... n ]'

@params zawiera ciąg deklaracji parametrów dla partii Transact-SQL, która jest podobna do sp_executesql. Parametry mogą być nvarchar(n) lub nvarchar(max).

Ciąg zawierający definicje wszystkich parametrów osadzonych w @tsql. Ciąg musi być stałą Unicode lub zmienną Unicode. Każda definicja parametru składa się z nazwy parametru i typu danych. n jest symbolem zastępczym wskazującym dodatkowe definicje parametrów. Każdy parametr określony w instrukcji musi być zdefiniowany w @params. Jeśli instrukcja Transact-SQL lub partia w instrukcji nie zawiera parametrów, @params nie jest wymagana. NULL jest wartością domyślną tego parametru.

[ @browse_information_mode = ] tinyint

Określa, czy zwracane są dodatkowe kolumny kluczy i informacje o tabeli źródłowej. Jeśli ustawiono 1wartość , każde zapytanie jest analizowane tak, jakby zawierało FOR BROWSE opcję w zapytaniu.

  • Jeśli ustawiono wartość 0, nie są zwracane żadne informacje.

  • Jeśli ustawiono 1wartość , każde zapytanie jest analizowane tak, jakby zawierało FOR BROWSE opcję w zapytaniu. Spowoduje to zwrócenie podstawowych nazw tabel jako informacji o kolumnie źródłowej.

  • Jeśli ustawiono 2wartość , każde zapytanie jest analizowane tak, jakby było używane podczas przygotowywania lub wykonywania kursora. Spowoduje to zwrócenie nazw widoków jako informacji o kolumnie źródłowej.

Zwracanie wartości kodu

sp_describe_first_result_set zawsze zwraca stan zero dla powodzenia. Jeśli procedura zgłasza błąd, a procedura jest wywoływana jako RPC, stan zwracania jest wypełniany przez typ błędu opisanego w kolumnie sys.dm_exec_describe_first_result_seterror_type . Jeśli procedura jest wywoływana z języka Transact-SQL, zwracana wartość jest zawsze równa zero, nawet jeśli wystąpi błąd.

Zestaw wyników

Te typowe metadane są zwracane w zestawie wyników z jednym wierszem dla każdej kolumny w metadanych wyników. W każdym wierszu opisano typ i wartość null kolumny w formacie opisanym w poniższej sekcji. Jeśli pierwsza instrukcja nie istnieje dla każdej ścieżki kontrolki, zwracany jest zestaw wyników z zerowymi wierszami.

Nazwa kolumny Typ danych Opis
is_hidden bit Wskazuje, że kolumna jest dodatkową kolumną dodaną do celów przeglądania informacji i że nie jest ona rzeczywiście wyświetlana w zestawie wyników. Nie może być null.
column_ordinal Int Zawiera położenie porządkowe kolumny w zestawie wyników. Pozycja pierwszej kolumny jest określona jako 1. Nie może być null.
name nazwa systemu Zawiera nazwę kolumny, jeśli można określić nazwę. W przeciwnym razie zawiera NULLwartość . Zmienna mogąca przyjmować wartość null.
is_nullable bit Zawiera wartość, jeśli kolumna zezwala na wartość 1 , NULL jeśli kolumna nie zezwala na 0wartość , a NULL jeśli nie można jej określić, czy kolumna zezwala na 1wartość .NULL Nie może być null.
system_type_id Int system_type_id Zawiera typ danych kolumny, jak określono w sys.typespliku . W przypadku typów CLR, mimo że kolumna system_type_name zwraca wartość NULL, ta kolumna zwraca wartość 240. Nie może być null.
system_type_name nvarchar(256) Zawiera nazwę i argumenty (takie jak długość, precyzja, skala), określone dla typu danych kolumny. Jeśli typ danych jest typem aliasu zdefiniowanego przez użytkownika, podstawowy typ systemu jest określony tutaj. Jeśli jest to typ zdefiniowany przez użytkownika CLR, NULL zostanie zwrócony w tej kolumnie. Zmienna mogąca przyjmować wartość null.
max_length smallint Maksymalna długość (w bajtach) kolumny.

-1 = Typ danych kolumny to varchar(max), nvarchar(max), varbinary(max)lub xml.

W przypadku kolumn tekstowychmax_length wartość to 16 lub wartość ustawiona przez sp_tableoption 'text in row'wartość . Nie może być null.
precision tinyint Precyzja kolumny, jeśli jest oparta na liczbach. W przeciwnym razie zwraca wartość 0. Nie może być null.
scale tinyint Skala kolumny, jeśli jest oparta na wartości liczbowej. W przeciwnym razie zwraca wartość 0. Nie może być null.
collation_name nazwa systemu Nazwa sortowania kolumny, jeśli jest oparta na znakach. W przeciwnym razie zwraca wartość NULL. Zmienna mogąca przyjmować wartość null.
user_type_id Int W przypadku typów CLR i aliasów zawiera user_type_id typu danych kolumny, jak określono w sys.types. W przeciwnym razie NULL. Zmienna mogąca przyjmować wartość null.
user_type_database nazwa systemu W przypadku typów CLR i aliasów zawiera nazwę bazy danych, w której zdefiniowano typ. W przeciwnym razie NULL. Zmienna mogąca przyjmować wartość null.
user_type_schema nazwa systemu W przypadku typów CLR i aliasów zawiera nazwę schematu, w którym zdefiniowano typ. W przeciwnym razie NULL. Zmienna mogąca przyjmować wartość null.
user_type_name nazwa systemu W przypadku typów CLR i aliasów zawiera nazwę typu. W przeciwnym razie NULL. Zmienna mogąca przyjmować wartość null.
assembly_qualified_type_name nvarchar(4000) W przypadku typów CLR zwraca nazwę zestawu i klasy definiującej typ. W przeciwnym razie NULL. Zmienna mogąca przyjmować wartość null.
xml_collection_id Int xml_collection_id Zawiera typ danych kolumny, jak określono w sys.columnspliku . Ta kolumna zwraca NULL, jeśli zwrócony typ nie jest skojarzony z kolekcją schematów XML. Zmienna mogąca przyjmować wartość null.
xml_collection_database nazwa systemu Zawiera bazę danych, w której zdefiniowano kolekcję schematów XML skojarzona z tym typem. Ta kolumna zwraca NULL, jeśli zwrócony typ nie jest skojarzony z kolekcją schematów XML. Zmienna mogąca przyjmować wartość null.
xml_collection_schema nazwa systemu Zawiera schemat, w którym zdefiniowano kolekcję schematów XML skojarzona z tym typem. Ta kolumna zwraca NULL, jeśli zwrócony typ nie jest skojarzony z kolekcją schematów XML. Zmienna mogąca przyjmować wartość null.
xml_collection_name nazwa systemu Zawiera nazwę kolekcji schematów XML skojarzonej z tym typem. Ta kolumna zwraca NULL, jeśli zwrócony typ nie jest skojarzony z kolekcją schematów XML. Zmienna mogąca przyjmować wartość null.
is_xml_document bit Zwraca wartość 1 , jeśli zwracany typ danych to XML, a ten typ ma gwarancję, że jest kompletnym dokumentem XML (w tym węzłem głównym), w przeciwieństwie do fragmentu XML. W przeciwnym razie zwraca wartość 0. Nie może być null.
is_case_sensitive bit Zwraca wartość 1 , jeśli kolumna jest typem ciągu z uwzględnieniem wielkości liter, a 0 jeśli tak nie jest. Nie może być null.
is_fixed_length_clr_type bit Zwraca wartość 1 , jeśli kolumna jest typem CLR o stałej długości i 0 jeśli nie jest. Nie może być null.
source_server nazwa systemu Nazwa serwera źródłowego zwróconego przez kolumnę w tym wyniku (jeśli pochodzi z serwera zdalnego). Nazwa jest podana w postaci wyświetlanej w pliku sys.servers. Zwraca NULL wartość, jeśli kolumna pochodzi z serwera lokalnego lub jeśli nie można określić, z którego serwera pochodzi. Jest wypełniany tylko wtedy, gdy wymagane są informacje o przeglądaniu. Zmienna mogąca przyjmować wartość null.
source_database nazwa systemu Nazwa źródłowej bazy danych zwróconej przez kolumnę w tym wyniku. Zwraca wartość NULL , jeśli nie można określić bazy danych. Jest wypełniany tylko wtedy, gdy wymagane są informacje o przeglądaniu. Zmienna mogąca przyjmować wartość null.
source_schema nazwa systemu Nazwa schematu źródłowego zwróconego przez kolumnę w tym wyniku. Zwraca wartość NULL , jeśli nie można określić schematu. Jest wypełniany tylko wtedy, gdy wymagane są informacje o przeglądaniu. Zmienna mogąca przyjmować wartość null.
source_table nazwa systemu Nazwa tabeli źródłowej zwróconej przez kolumnę w tym wyniku. Zwraca wartość NULL , jeśli nie można określić tabeli. Jest wypełniany tylko wtedy, gdy wymagane są informacje o przeglądaniu. Zmienna mogąca przyjmować wartość null.
source_column nazwa systemu Nazwa kolumny źródłowej zwróconej przez kolumnę wyników. Zwraca wartość NULL , jeśli nie można określić kolumny. Jest wypełniany tylko wtedy, gdy wymagane są informacje o przeglądaniu. Zmienna mogąca przyjmować wartość null.
is_identity_column bit Zwraca wartość 1 , jeśli kolumna jest kolumną tożsamości, a 0 jeśli nie. Zwraca wartość NULL , jeśli nie można określić, że kolumna jest kolumną tożsamości. Zmienna mogąca przyjmować wartość null.
is_part_of_unique_key bit Zwraca wartość 1 , jeśli kolumna jest częścią unikatowego indeksu (w tym unikatowego i podstawowego ograniczenia) i 0 jeśli nie. Zwraca wartość NULL , jeśli nie można określić, że kolumna jest częścią unikatowego indeksu. Wypełniane tylko w przypadku żądania przeglądania informacji. Zmienna mogąca przyjmować wartość null.
is_updateable bit Zwraca 1 wartość , jeśli kolumna jest aktualizowalna, a 0 jeśli nie. Zwraca wartość NULL , jeśli nie można określić, że kolumna jest aktualizowalna. Zmienna mogąca przyjmować wartość null.
is_computed_column bit Zwraca wartość 1 , jeśli kolumna jest obliczoną kolumną, a 0 jeśli nie. Zwraca wartość NULL , jeśli nie można określić, że kolumna jest kolumną obliczaną. Zmienna mogąca przyjmować wartość null.
is_sparse_column_set bit Zwraca wartość 1 , jeśli kolumna jest kolumną rozrzedliwą, a 0 jeśli nie. Zwraca wartość NULL , jeśli nie można określić, że kolumna jest częścią zestawu kolumn rozrzedzona. Zmienna mogąca przyjmować wartość null.
ordinal_in_order_by_list smallint Pozycja tej kolumny na ORDER BY liście. Zwraca wartość NULL , jeśli kolumna nie jest wyświetlana na ORDER BY liście lub jeśli ORDER BY nie można jednoznacznie określić listy. Zmienna mogąca przyjmować wartość null.
order_by_list_length smallint ORDER BY Długość listy. Zwraca wartość NULL , jeśli nie ma ORDER BY listy lub jeśli ORDER BY nie można jednoznacznie określić listy. Ta wartość jest taka sama dla wszystkich wierszy zwracanych przez sp_describe_first_result_setelement . Zmienna mogąca przyjmować wartość null.
order_by_is_descending smallint ordinal_in_order_by_list Jeśli parametr nie ma wartości , NULL kolumna order_by_is_descendingzgłasza kierunek ORDER BY klauzuli dla tej kolumny. W przeciwnym razie raportuje NULL. Zmienna mogąca przyjmować wartość null.
tds_type_id Int Do użytku wewnętrznego. Nie może być null.
tds_length Int Do użytku wewnętrznego. Nie może być null.
tds_collation_id Int Do użytku wewnętrznego. Zmienna mogąca przyjmować wartość null.
tds_collation_sort_id tinyint Do użytku wewnętrznego. Zmienna mogąca przyjmować wartość null.

Uwagi

sp_describe_first_result_set gwarantuje, że jeśli procedura zwraca pierwsze metadane zestawu wyników dla (hipotetycznej) partii A i jeśli ta partia (A) jest wykonywana, partia albo:

  • zgłasza błąd czasu optymalizacji
  • zgłasza błąd czasu wykonywania
  • zwraca brak zestawu wyników
  • zwraca pierwszy zestaw wyników z tymi samymi metadanymi opisanymi przez sp_describe_first_result_set

Nazwa, wartość null i typ danych mogą się różnić. Jeśli sp_describe_first_result_set zwraca pusty zestaw wyników, gwarancja polega na tym, że wykonanie wsadowe zwraca zestawy wyników bez wyników.

Ta gwarancja zakłada, że na serwerze nie ma żadnych istotnych zmian schematu. Odpowiednie zmiany schematu na serwerze nie obejmują tworzenia tabel tymczasowych ani zmiennych tabeli w partii A między czasem, który sp_describe_first_result_set jest wywoływany a czasem zwracanym podczas wykonywania zestawu wyników, w tym zmian schematu wprowadzonych przez partię B.

sp_describe_first_result_set Zwraca błąd w dowolnym z następujących przypadków:

  • @tsql danych wejściowych nie jest prawidłową Transact-SQL wsadową. Ważność jest określana przez analizowanie i analizowanie partii Transact-SQL. Wszelkie błędy spowodowane przez partię podczas optymalizacji zapytań lub podczas wykonywania nie są brane pod uwagę podczas określania, czy Transact-SQL partii jest prawidłowa.

  • @params nie jest NULL i zawiera ciąg, który nie jest składniowo prawidłowym ciągiem deklaracji dla parametrów lub jeśli zawiera ciąg, który deklaruje dowolny parametr więcej niż jeden raz.

  • Partia danych wejściowych Transact-SQL deklaruje zmienną lokalną o tej samej nazwie co parametr zadeklarowany w @params.

  • Instrukcja używa tabeli tymczasowej.

  • Zapytanie zawiera tworzenie stałej tabeli, która jest następnie odpytywane.

Jeśli wszystkie inne testy powiedzie się, zostaną uwzględnione wszystkie możliwe ścieżki przepływu sterowania wewnątrz partii wejściowej. Uwzględnia to wszystkie instrukcje przepływu sterowania (GOTO, IF/ELSE, WHILEi Transact-SQLTRY/CATCH bloki), a także wszelkie procedury, dynamiczne partie Transact-SQL lub wyzwalacze wywoływane z partii wejściowej przez instrukcjęEXECUTE, instrukcję DDL, która powoduje wyzwolenie wyzwalaczy DDL lub instrukcję DML, która powoduje wyzwolenie wyzwalaczy na tabeli docelowej lub w tabeli zmodyfikowanej ze względu na działanie kaskadowe w ograniczeniu klucza obcego. W pewnym momencie, jak w przypadku wielu możliwych ścieżek sterujących, algorytm zatrzymuje się.

Dla każdej ścieżki przepływu sterowania pierwsza instrukcja (jeśli istnieje), która zwraca zestaw wyników, jest określana przez sp_describe_first_result_set.

Jeśli w partii znajduje się wiele możliwych pierwszych instrukcji, ich wyniki mogą się różnić w liczbie kolumn, nazwy kolumny, wartości null i typu danych. Sposób obsługi tych różnic opisano tutaj bardziej szczegółowo:

  • Jeśli liczba kolumn się różni, zostanie zgłoszony błąd i nie zostanie zwrócony żaden wynik.

  • Jeśli nazwa kolumny jest inna, zwracana nazwa kolumny ma wartość NULL.

  • Jeśli wartość null będzie się różnić, zwracana wartość null zezwala na wartość NULL.

  • Jeśli typ danych różni się, zostanie zgłoszony błąd i nie zostanie zwrócony żaden wynik, z wyjątkiem następujących przypadków:

    • varchar(a) to varchar(a'), gdzie a". >
    • varchar(a) do varchar(max)
    • nvarchar(a) do nvarchar(a'), gdzie a' >
    • nvarchar(a) do nvarchar(max)
    • varbinary(a) do varbinary(a'), gdzie a". >
    • varbinary(a) do varbinary(max)

sp_describe_first_result_set nie obsługuje rekursji pośredniej.

Uprawnienia

Wymaga uprawnień do wykonania argumentu @tsql.

Przykłady

Typowe przykłady

Odp. Przykład podstawowy

W poniższym przykładzie opisano zestaw wyników zwrócony z pojedynczego zapytania.

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

W poniższym przykładzie pokazano zestaw wyników zwrócony z pojedynczego zapytania zawierającego parametr.

EXECUTE 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. Przykłady trybu przeglądania

W poniższych trzech przykładach przedstawiono kluczową różnicę między różnymi trybami przeglądania informacji. W wynikach zapytania znajdują się tylko odpowiednie kolumny.

Przykład użycia metody 0wskazuje, że nie są zwracane żadne informacje.

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

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

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

Oto zestaw wyników częściowych.

jest_ukryty column_ordinal nazwa source_schema source_table source_column is_part_of_unique_key
0 1 b3 NULL NULL NULL NULL

Przykład użycia wartości 1 wskazującej, że zwraca informacje tak, jakby zawierały opcję PRZEGLĄDANIA W zapytaniu.

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

Oto zestaw wyników częściowych.

jest_ukryty column_ordinal nazwa 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

Przykład użycia 2 wskazującego przeanalizowane tak, jakby przygotowywano kursor.

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

Oto zestaw wyników.

jest_ukryty column_ordinal nazwa 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. Przechowywanie wyników w tabeli

W niektórych scenariuszach należy umieścić wyniki sp_describe_first_result_set procedury w tabeli, aby umożliwić dalsze przetwarzanie schematu.

Najpierw należy utworzyć tabelę zgodną z danymi wyjściowymi sp_describe_first_result_set procedury:

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
);

Podczas tworzenia tabeli można przechowywać schemat niektórych zapytań w tej tabeli.

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

INSERT INTO #frs
EXECUTE sys.sp_describe_first_result_set @tsql;

SELECT *
FROM #frs;

Przykłady problemów

W poniższych przykładach użyto dwóch tabel dla wszystkich przykładów. Wykonaj następujące instrukcje, aby utworzyć przykładowe tabele.

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
);

Błąd, ponieważ liczba kolumn różni się

Liczba kolumn w możliwych pierwszych zestawach wyników różni się w tym przykładzie.

EXECUTE 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.';

Błąd, ponieważ typy danych różnią się

Typy kolumn różnią się w różnych możliwych pierwszych zestawach wyników.

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

Powoduje to błąd niezgodności typów (int i smallint).

Nie można określić nazwy kolumny

Kolumny w możliwych pierwszych zestawach wyników różnią się długością dla tego samego typu zmiennej długości, wartości null i nazw kolumn:

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

Oto zestaw wyników częściowych.

Kolumna Wartość
name Nieznana nazwa kolumny
system_type_name varchar
max_length 20
is_nullable 1

Nazwa kolumny musi być identyczna za pomocą aliasu

Tak samo jak poprzednio, ale kolumny mają taką samą nazwę za pomocą aliasu kolumny.

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

Oto zestaw wyników częściowych.

Kolumna Wartość
name b
system_type_name varchar
max_length 20
is_nullable 1

Błąd, ponieważ nie można dopasować typów kolumn

Typy kolumn różnią się w różnych możliwych pierwszych zestawach wyników.

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

Spowoduje to błąd niezgodności typów (varchar(10) vs. nvarchar(10)).

Zestaw wyników może zwrócić błąd

Pierwszy zestaw wyników to błąd lub zestaw wyników.

EXECUTE 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.';

Oto zestaw wyników częściowych.

Kolumna Wartość
name a
system_type_name int
is_nullable 1

Niektóre ścieżki kodu nie zwracają żadnych wyników

Pierwszy zestaw wyników ma wartość null lub zestaw wyników.

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

Oto zestaw wyników częściowych.

Kolumna Wartość
name a
system_type_name int
is_nullable 1

Wynik z dynamicznego kodu SQL

Pierwszy zestaw wyników to dynamiczny kod SQL, który można odnaleźć, ponieważ jest to ciąg literału.

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

Oto zestaw wyników częściowych.

Kolumna Wartość
name a
system_type_name int
is_nullable 1

Niepowodzenie wyniku z dynamicznej bazy danych SQL

Pierwszy zestaw wyników jest niezdefiniowany z powodu dynamicznego kodu SQL.

EXECUTE 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'';
EXECUTE(@SQL);';

Spowoduje to wystąpienie błędu. Wynik nie jest wykrywalny z powodu dynamicznego kodu SQL.

Zestaw wyników określony przez użytkownika

Pierwszy zestaw wyników jest określany ręcznie przez użytkownika.

EXECUTE 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'';
EXECUTE(@SQL)
    WITH RESULT SETS (
        (Column1 BIGINT NOT NULL)
    );';

Oto zestaw wyników częściowych.

Kolumna Wartość
name Column1
system_type_name bigint
is_nullable 0

Błąd spowodowany niejednoznacznym zestawem wyników

W tym przykładzie przyjęto założenie, że inny użytkownik o nazwie user1 ma tabelę o nazwie t1 w domyślnym schemacie s1 z kolumnami (a int NOT NULL).

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

Ten kod powoduje błąd Invalid object name . t1 może mieć wartość dbo.t1 lub s1.t1, z których każda ma inną liczbę kolumn.

Wynik nawet z niejednoznacznym zestawem wyników

Użyj tych samych założeń co w poprzednim przykładzie.

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

Oto zestaw wyników częściowych.

Kolumna Wartość
name a
system_type_name int
is_nullable 1

Zarówno dbo.t1.a typ s1.t1.a, jak i różne wartości null.