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_executesql
ist. 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 eineFOR 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_set
Fehlers 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 1 angegeben. Lässt keine NULL-Werte zu. |
name |
sysname | Enthält den Namen der Spalte, wenn ein Name bestimmt werden kann. Andernfalls enthält NULL sie . 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 NULL ist, 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 240 zurück, obwohl die system_type_name Spalte zurückgegeben NULL wird. 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.types angegeben. 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 NULL der 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
, WHILE
und Transact-SQL-BlöckeCATCH
TRY
/) 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
NULL
die 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 , 0
die 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.