sp_describe_first_result_set (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric

Gibt die Metadaten für das erste mögliche Resultset des Transact-SQL-Batchs zurück. Gibt ein leeres Resultset zurück, wenn vom Batch keine Ergebnisse zurückgegeben werden. Löst einen Fehler aus, wenn der Datenbank-Engine die Metadaten für die erste Abfrage nicht ermitteln kann, die durch Ausführen einer statischen Analyse ausgeführt wird. Die dynamische Verwaltungsansicht sys.dm_exec_describe_first_result_set dieselben Informationen zurückgibt.

Transact-SQL-Syntaxkonventionen

Syntax

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

Argumente

[ @tsql = ] 'tsql'

Mindestens eine Transact-SQL-Anweisung. @tsql kann nvarchar(n) oder nvarchar(max)sein.

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

@params stellt eine Deklarationszeichenfolge für Parameter für den Transact-SQL-Batch bereit, der ähnlich sp_executesqlist. Parameter können nvarchar(n) oder nvarchar(max)sein.

Eine Zeichenfolge, die die Definitionen aller Parameter enthält, die in @tsql eingebettet sind. Die Zeichenfolge muss eine Unicode-Konstante oder eine Unicode-Variable sein. Jede Parameterdefinition besteht aus einem Parameternamen und einem Datentyp. n ist ein Platzhalter für zusätzlicher Parameterdefinitionen. Jeder in der Anweisung angegebene Parameter muss in @params definiert werden. Wenn die Transact-SQL-Anweisung oder der Batch in der Anweisung keine Parameter enthält, ist @params nicht erforderlich. NULL ist der Standardwert für diesen Parameter.

[ @browse_information_mode = ] tinyint

Gibt an, ob zusätzliche Schlüsselspalten und Quelltabelleninformationen zurückgegeben werden. Bei Festlegung auf 1, wird jede Abfrage so analysiert, als ob sie eine FOR BROWSE Option für die Abfrage enthält.

  • Bei Festlegung auf 0, werden keine Informationen zurückgegeben.

  • Bei Festlegung auf 1, wird jede Abfrage so analysiert, als ob sie eine FOR BROWSE Option für die Abfrage enthält. Dadurch werden Basistabellennamen als Quellspalteninformationen zurückgegeben.

  • Bei Festlegung auf 2, wird jede Abfrage so analysiert, als würde sie beim Vorbereiten oder Ausführen eines Cursors verwendet werden. Dadurch werden Ansichtsnamen als Quellspalteninformationen zurückgegeben.

Rückgabecodewerte

sp_describe_first_result_set gibt immer den Status Null bei Erfolg zurück. Wenn die Prozedur einen Fehler auslöst und die Prozedur als RPC aufgerufen wird, wird der Rückgabestatus durch den Typ des in der spalte error_type beschriebenen sys.dm_exec_describe_first_result_setFehlers aufgefüllt. Wenn die Prozedur von Transact-SQL aufgerufen wird, ist der Rückgabewert immer null, auch wenn ein Fehler auftritt.

Resultset

Diese allgemeinen Metadaten werden in den Ergebnismetadaten als Resultset mit einer Zeile für jede Spalte zurückgegeben. Jede Zeile beschreibt den Typ und die NULL-Zulässigkeit der Spalte in dem Format, das im folgenden Abschnitt beschriebenen wird. Wenn die erste Anweisung für jeden Steuerelementpfad nicht vorhanden ist, wird ein Resultset mit null Zeilen zurückgegeben.

Spaltenname Datentyp Beschreibung
is_hidden bit Gibt an, dass es sich bei der Spalte um eine zusätzliche Spalte handelt, die für Browserinformationen hinzugefügt wird und dass sie nicht tatsächlich im Resultset angezeigt wird. Lässt keine NULL-Werte zu.
column_ordinal int Enthält die Ordnungsposition der Spalte im Resultset. Die Position der ersten Spalte wird als 1angegeben. Lässt keine NULL-Werte zu.
name sysname Enthält den Namen der Spalte, wenn ein Name bestimmt werden kann. Andernfalls enthält NULLsie . NULL-Werte sind zulässig.
is_nullable bit Enthält den Wert 1 , wenn die Spalte zulässt NULL, 0 wenn die Spalte nicht zulässig NULList, und 1 wenn sie nicht bestimmt werden kann, wenn die Spalte zulässt NULL. Lässt keine NULL-Werte zu.
system_type_id int Enthält den system_type_id Datentyp der Spalte gemäß der Angabe in sys.types. Bei CLR-Typen gibt diese Spalte den Wert 240zurück, obwohl die system_type_name Spalte zurückgegeben NULLwird. Lässt keine NULL-Werte zu.
system_type_name nvarchar(256) Enthält den Namen und die Argumente (z. B. Länge, Genauigkeit oder Skala), die für den Datentyp der Spalte angegeben wurden. Wenn der Datentyp ein benutzerdefinierter Aliastyp ist, wird der zugrunde liegende Systemtyp hier angegeben. Wenn es sich um einen benutzerdefinierten CLR-Typ handelt, NULL wird in dieser Spalte zurückgegeben. NULL-Werte sind zulässig.
max_length smallint Maximale Länge (in Byte) für die Spalte.

-1 = Spaltendatentyp ist varchar(max), nvarchar(max), varbinary(max) oder xml.

Bei Textspalten ist 16 der max_length Wert oder der von sp_tableoption 'text in row'. Lässt keine NULL-Werte zu.
precision tinyint Die Genauigkeit der Spalte, wenn sie auf numerischen Werten basiert. Andernfalls wird 0 zurückgegeben. Lässt keine NULL-Werte zu.
scale tinyint Die Skalierung der Spalte, wenn sie auf numerischen Werten basiert. Andernfalls wird 0 zurückgegeben. Lässt keine NULL-Werte zu.
collation_name sysname Name der Sortierung der Spalte, wenn diese zeichenbasiert ist. Andernfalls wird NULL zurückgegeben. NULL-Werte sind zulässig.
user_type_id int Enthält für CLR- und Aliastypen den user_type_id Datentyp der Spalte, wie in sys.typesangegeben. Andernfalls lautet NULL. NULL-Werte sind zulässig.
user_type_database sysname Enthält bei CLR- und Aliastypen den Namen der Datenbank, in der der Typ definiert wurde. Andernfalls lautet NULL. NULL-Werte sind zulässig.
user_type_schema sysname Enthält bei CLR- und Aliastypen den Namen des Schemas, in dem der Typ definiert wurde. Andernfalls lautet NULL. NULL-Werte sind zulässig.
user_type_name sysname Enthält bei CLR- und Aliastypen den Namen des Typs. Andernfalls lautet NULL. NULL-Werte sind zulässig.
assembly_qualified_type_name nvarchar(4000) Gibt bei CLR-Typen den Namen der Assembly und der Klasse zurück, die den Typ definieren. Andernfalls lautet NULL. NULL-Werte sind zulässig.
xml_collection_id int Enthält den xml_collection_id Datentyp der Spalte gemäß der Angabe in sys.columns. Diese Spalte gibt zurück NULL , wenn der zurückgegebene Typ keiner XML-Schemaauflistung zugeordnet ist. NULL-Werte sind zulässig.
xml_collection_database sysname Enthält die Datenbank, in der die XML-Schemaauflistung definiert ist, die diesem Typ zugeordnet wurde. Diese Spalte gibt zurück NULL , wenn der zurückgegebene Typ keiner XML-Schemaauflistung zugeordnet ist. NULL-Werte sind zulässig.
xml_collection_schema sysname Enthält das Schema, in dem die XML-Schemaauflistung definiert ist, die diesem Typ zugeordnet wurde. Diese Spalte gibt zurück NULL , wenn der zurückgegebene Typ keiner XML-Schemaauflistung zugeordnet ist. NULL-Werte sind zulässig.
xml_collection_name sysname Enthält den Namen der XML-Schemaauflistung, die diesem Typ zugeordnet wurde. Diese Spalte gibt zurück NULL , wenn der zurückgegebene Typ keiner XML-Schemaauflistung zugeordnet ist. NULL-Werte sind zulässig.
is_xml_document bit Gibt zurück 1 , wenn der zurückgegebene Datentyp XML ist und dieser Typ garantiert ein vollständiges XML-Dokument (einschließlich eines Stammknotens) ist, im Gegensatz zu einem XML-Fragment. Andernfalls wird 0 zurückgegeben. Lässt keine NULL-Werte zu.
is_case_sensitive bit Gibt zurück 1 , wenn es sich bei der Spalte um einen Zeichenfolgentyp mit Groß-/Kleinschreibung handelt und 0 dies nicht der Fall ist. Lässt keine NULL-Werte zu.
is_fixed_length_clr_type bit Gibt zurück 1 , wenn die Spalte ein CLR-Typ mit fester Länge ist und 0 nicht. Lässt keine NULL-Werte zu.
source_server sysname Der Name des ursprünglichen Servers, der von der Spalte in diesem Ergebnis zurückgegeben wurde (bei einem Remoteserver). Der Name wird angegeben, wie er in sys.servers. Gibt zurück NULL , ob die Spalte auf dem lokalen Server stammt oder nicht bestimmt werden kann, auf welchem Server sie stammt. Wird nur aufgefüllt, wenn die Suche nach Informationen erforderlich ist. NULL-Werte sind zulässig.
source_database sysname Der Name der ursprünglichen Datenbank, die von der Spalte in diesem Ergebnis zurückgegeben wird. Gibt zurück NULL , wenn die Datenbank nicht bestimmt werden kann. Wird nur aufgefüllt, wenn die Suche nach Informationen erforderlich ist. NULL-Werte sind zulässig.
source_schema sysname Der Name des ursprünglichen Schemas, das von der Spalte in diesem Ergebnis zurückgegeben wird. Gibt zurück NULL , wenn das Schema nicht bestimmt werden kann. Wird nur aufgefüllt, wenn die Suche nach Informationen erforderlich ist. NULL-Werte sind zulässig.
source_table sysname Der Name der ursprünglichen Tabelle, die von der Spalte in diesem Ergebnis zurückgegeben wird. Gibt zurück NULL , wenn die Tabelle nicht bestimmt werden kann. Wird nur aufgefüllt, wenn die Suche nach Informationen erforderlich ist. NULL-Werte sind zulässig.
source_column sysname Der Name der ursprünglichen Spalte, die von der Ergebnisspalte zurückgegeben wird. Gibt zurück NULL , wenn die Spalte nicht bestimmt werden kann. Wird nur aufgefüllt, wenn die Suche nach Informationen erforderlich ist. NULL-Werte sind zulässig.
is_identity_column bit Gibt zurück 1 , wenn die Spalte eine Identitätsspalte ist und 0 wenn nicht. Gibt zurück NULL , wenn sie nicht bestimmt werden kann, dass es sich bei der Spalte um eine Identitätsspalte handelt. NULL-Werte sind zulässig.
is_part_of_unique_key bit Gibt zurück 1 , wenn die Spalte Teil eines eindeutigen Indexes ist (einschließlich eindeutiger und primärer Einschränkung) und 0 wenn nicht. Gibt zurück NULL , wenn sie nicht bestimmt werden kann, dass die Spalte Teil eines eindeutigen Indexes ist. Wird nur aufgefüllt, wenn die Suche nach Informationen erforderlich ist. NULL-Werte sind zulässig.
is_updateable bit Gibt zurück 1 , wenn die Spalte aktualisierbar ist und 0 wenn nicht. Gibt zurück NULL , wenn sie nicht bestimmt werden kann, dass die Spalte aktualisierbar ist. NULL-Werte sind zulässig.
is_computed_column bit Gibt zurück 1 , wenn es sich bei der Spalte um eine berechnete Spalte handelt und 0 wenn nicht. Gibt zurück NULL , wenn sie nicht bestimmt werden kann, dass es sich bei der Spalte um eine berechnete Spalte handelt. NULL-Werte sind zulässig.
is_sparse_column_set bit Gibt zurück 1 , wenn die Spalte eine geringe Spalte ist und 0 wenn nicht. Gibt zurück NULL , wenn sie nicht bestimmt werden kann, dass die Spalte Teil einer geringen Spaltenmenge ist. NULL-Werte sind zulässig.
ordinal_in_order_by_list smallint Position dieser Spalte in ORDER BY der Liste. Gibt zurück NULL , wenn die Spalte nicht in der ORDER BY Liste angezeigt wird oder die ORDER BY Liste nicht eindeutig bestimmt werden kann. NULL-Werte sind zulässig.
order_by_list_length smallint Länge der ORDER BY Liste. Gibt zurück NULL , wenn keine ORDER BY Liste vorhanden ist oder wenn die ORDER BY Liste nicht eindeutig bestimmt werden kann. Dieser Wert ist für alle Zeilen identisch, die von sp_describe_first_result_set. NULL-Werte sind zulässig.
order_by_is_descending smallint Ist dies ordinal_in_order_by_list nicht NULLder Fall, meldet die order_by_is_descending Spalte die Richtung der ORDER BY Klausel für diese Spalte. Andernfalls wird berichtet NULL. NULL-Werte sind zulässig.
tds_type_id int Nur zur internen Verwendung. Lässt keine NULL-Werte zu.
tds_length int Nur zur internen Verwendung. Lässt keine NULL-Werte zu.
tds_collation_id int Nur zur internen Verwendung. NULL-Werte sind zulässig.
tds_collation_sort_id tinyint Nur zur internen Verwendung. NULL-Werte sind zulässig.

Hinweise

sp_describe_first_result_set garantiert, dass, wenn die Prozedur die ersten Resultsetmetadaten für (einen hypothetischen) Batch A zurückgibt und wenn dieser Batch (A) dann ausgeführt wird, entweder:

  • löst einen Optimierungszeitfehler aus.
  • löst einen Laufzeitfehler aus.
  • gibt kein Resultset zurück.
  • gibt ein erstes Resultset mit denselben Metadaten zurück, die von sp_describe_first_result_set

Der Name, die NULL-Zulässigkeit und der Datentyp können abweichen. Wenn sp_describe_first_result_set ein leeres Resultset zurückgegeben wird, besteht die Garantie darin, dass die Batchausführung keine Resultsets zurückgibt.

Dabei wird vorausgesetzt, dass keine relevanten Schemaänderungen auf dem Server vorgenommen wurden. Relevante Schemaänderungen auf dem Server enthalten nicht das Erstellen temporärer Tabellen oder Tabellenvariablen im Batch A zwischen dem Aufruf sp_describe_first_result_set und dem Zeitpunkt, zu dem das Resultset während der Ausführung zurückgegeben wird, einschließlich Schemaänderungen, die von Batch B vorgenommen wurden.

sp_describe_first_result_set gibt in einem der folgenden Fälle einen Fehler zurück:

  • Die Eingabe @tsql ist kein gültiger Transact-SQL-Batch. Die Gültigkeit wird durch Parsen und Analysieren des Transact-SQL-Batchs bestimmt. Alle Fehler, die während der Abfrageoptimierung oder während der Ausführung durch den Batch verursacht werden, werden nicht berücksichtigt, wenn ermittelt wird, ob der Transact-SQL-Batch gültig ist.

  • @params ist nicht NULL und enthält eine Zeichenfolge, die keine syntaktisch gültige Deklarationszeichenfolge für Parameter ist, oder wenn sie eine Zeichenfolge enthält, die einen Parameter mehr als einmal deklariert.

  • Der Transact-SQL-Eingabebatch deklariert eine lokale Variable mit demselben Namen wie ein in @params deklarierter Parameter.

  • Die Anweisung verwendet eine temporäre Tabelle.

  • Die Abfrage umfasst die Erstellung einer dauerhaften Tabelle, die dann abgefragt wird.

Wenn alle anderen Überprüfungen erfolgreich sind, werden alle möglichen Ablaufsteuerungspfade im Eingabebatch berücksichtigt. Dies berücksichtigt alle Steuerungsflussanweisungen (GOTO, IF/ELSE, WHILEund Transact-SQL-BlöckeCATCHTRY/) sowie alle Prozeduren, dynamischen Transact-SQL-Batches oder Trigger, die aus dem Eingabebatch durch eine EXEC Anweisung aufgerufen werden, eine DDL-Anweisung, die bewirkt, dass DDL-Trigger ausgelöst werden, oder eine DML-Anweisung, die Trigger für eine Zieltabelle oder eine Tabelle auslöst, die aufgrund einer Cascading-Aktion für eine Fremdschlüsseleinschränkung geändert wird. Irgendwann stoppt ein Algorithmus, wie viele mögliche Kontrollpfade.

Für jeden Ablaufpfad des Steuerelements wird die erste Anweisung (falls vorhanden) bestimmt sp_describe_first_result_set, die ein Resultset zurückgibt.

Bei mehreren möglichen ersten Anweisungen in einem Batch kann sich das jeweilige Ergebnis im Hinblick auf die Anzahl der Spalten, die Spaltennamen, die NULL-Zulässigkeit und den Datentyp unterscheiden. Im Folgenden wird ausführlicher erläutert, wie diese Unterschiede gehandhabt werden:

  • Wenn sich die Anzahl der Spalten unterscheidet, wird ein Fehler ausgelöst, und es wird kein Ergebnis zurückgegeben.

  • Wenn sich der Spaltenname unterscheidet, wird der zurückgegebene Spaltenname auf NULL.

  • Wenn sich die Nullbarkeit unterscheidet, lässt NULLdie zurückgegebene Nullbarkeit zu.

  • Wenn sich der Datentyp unterscheidet, wird ein Fehler ausgelöst, und es wird kein Ergebnis zurückgegeben, mit Ausnahme der folgenden Fälle:

    • varchar(a) zu varchar(a') mit a' > a.
    • varchar(a) zu varchar(max)
    • nvarchar(a) zu nvarchar(a') mit a' > a.
    • nvarchar(a) zu nvarchar(max)
    • varbinary(a) zu varbinary(a') mit a' > a.
    • varbinary(a) zu varbinary(max)

sp_describe_first_result_set unterstützt keine indirekte Rekursion.

Berechtigungen

Erfordert die Berechtigung zum Ausführen des @tsql Arguments.

Beispiele

Typische Beispiele

A. Einfaches Beispiel

Im folgenden Beispiel wird das von einer einzelnen Abfrage zurückgegebene Resultset beschrieben.

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

Im folgenden Beispiel wird das von einer einzelnen Abfrage mit einem Parameter zurückgegebene Resultset veranschaulicht.

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. Beispiele für den Suchmodus

In den folgenden drei Beispielen wird der Hauptunterschied zwischen den unterschiedlichen Modi für die Informationssuche veranschaulicht. Nur die relevanten Spalten sind in den Abfrageergebnissen enthalten.

Beispiel für die Verwendung , 0die angibt, dass keine Informationen zurückgegeben werden.

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;

Dies ist ein Auszug aus dem Resultset.

is_hidden column_ordinal name source_schema source_table source_column is_part_of_unique_key
0 1 b3 NULL NULL NULL NULL

Beispiel mit dem Wert 1, der angibt, dass Informationen so zurückgegeben werden, als ob in der Abfrage eine FOR BROWSE-Option eingeschlossen wäre.

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

Dies ist ein Auszug aus dem Resultset.

is_hidden column_ordinal name 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

Beispiel mit 2, das analysiert wird, als ob Sie einen Cursor vorbereiten.

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

Hier sehen Sie das Ergebnis.

is_hidden column_ordinal name 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. Speichern von Ergebnissen in einer Tabelle

In einigen Szenarien müssen Sie die Ergebnisse der sp_describe_first_result_set Prozedur in eine Tabelle einfügen, damit Sie das Schema weiter verarbeiten können.

Zunächst müssen Sie eine Tabelle erstellen, die der Ausgabe der Prozedur sp_describe_first_result_set entspricht:

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

Wenn Sie eine Tabelle erstellen, können Sie das Schema einer Abfrage in dieser Tabelle speichern.

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

INSERT INTO #frs
EXEC sys.sp_describe_first_result_set @tsql;

SELECT * FROM #frs;

Beispiele für Probleme

In den folgenden Beispielen werden zwei Tabellen für alle Beispiele verwendet. Führen Sie die folgenden Anweisungen aus, um die Beispieltabellen zu erstellen.

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

Fehler aufgrund unterschiedlicher Spaltenanzahl

Die Anzahl der Spalten in möglichen ersten Resultsets weicht in diesem Beispiel ab.

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

Fehler aufgrund abweichender Datentypen

Die Spaltentypen unterscheiden sich in verschiedenen möglichen ersten Resultsets.

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

Dies führt zu einem Fehler bei nicht übereinstimmenden Typen (int vs. smallint).

Spaltenname kann nicht bestimmt werden

Die Spalten in möglichen ersten Resultsets unterscheiden sich hinsichtlich der Länge für identische Typen mit variabler Länge, NULL-Zulässigkeiten und Spaltennamen:

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

Dies ist ein Auszug aus dem Resultset.

Spalte Wert
name Unbekannter Spaltenname
system_type_name varchar
max_length 20
is_nullable 1

Spaltenname mit durch Aliasing erzwungenem identischem Spaltennamen

Analog zum vorherigen, die Namen der Spalten sind jedoch aufgrund von Spaltenaliasing identisch.

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

Dies ist ein Auszug aus dem Resultset.

Spalte Wert
name b
system_type_name varchar
max_length 20
is_nullable 1

Fehler, da Spaltentypen nicht abgeglichen werden können

Die Spaltentypen unterscheiden sich in verschiedenen möglichen ersten Resultsets.

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

Dies führt zu einem Fehler bei nicht übereinstimmenden Typen (varchar(10) vs. nvarchar(10)).

Resultset kann einen Fehler zurückgeben

Das erste Resultset ist Fehler oder Resultset.

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

Dies ist ein Auszug aus dem Resultset.

Spalte Wert
name a
system_type_name int
is_nullable 1

Einige Codepfade geben keine Ergebnisse zurück

Der erste Resultset ist NULL oder ein Resultset.

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

Dies ist ein Auszug aus dem Resultset.

Spalte Wert
name a
system_type_name int
is_nullable 1

Ergebnis von dynamischem SQL

First result set is dynamic SQL that is discoverable because it's a literal string.

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

Dies ist ein Auszug aus dem Resultset.

Spalte Wert
name a
system_type_name int
is_nullable 1

Ergebnisfehler von dynamischem SQL

Das erste Resultset ist aufgrund von dynamischem SQL nicht definiert.

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

Dies führt zu einem Fehler. Das Ergebnis ist aufgrund der dynamischen SQL-Datei nicht auffindbar.

Vom Benutzer angegebenes Resultset

Das erste Resultset wird manuell vom Benutzer angegeben.

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

Dies ist ein Auszug aus dem Resultset.

Spalte Wert
name Column1
system_type_name bigint
is_nullable 0

Fehler aufgrund eines mehrdeutigen Resultsets

In diesem Beispiel wird davon ausgegangen, dass ein anderer benannter user1 Benutzer über eine Tabelle im Standardschema s1 mit Spalten (a int NOT NULL) verfügtt1.

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

Dieser Code führt zu einem Invalid object name Fehler. t1 kann entweder dbo.t1 oder s1.t1, jeweils mit einer anderen Anzahl von Spalten, sein.

Ergebnis auch bei mehrdeutigem Resultset

Verwenden Sie die gleichen Annahmen wie im vorherigen Beispiel.

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

Dies ist ein Auszug aus dem Resultset.

Spalte Wert
name a
system_type_name int
is_nullable 1

Sowohl typ dbo.t1.a s1.t1.a int als auch unterschiedliche Nullwerte.