Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Funktionsweise von sys.dm_exec_describe_first_result_set in SQL Server

In SQL Server das sys.dm_exec_describe_first_result_set Die dynamische Verwaltungsfunktion gibt die Metadaten der ersten Ergebnismenge für eine bestimmte T-SQL-Anweisung oder -Anweisungen zurück.

Diese Funktion verwendet denselben Algorithmus wie sp_describe_first_result_set gespeicherte Systemprozedur und macht so ziemlich dasselbe.

Es akzeptiert drei Parameter, von denen der erste die zu analysierende(n) T-SQL-Anweisung(en) ist.

Syntax

Die Syntax lautet wie folgt:

sys.dm_exec_describe_first_result_set(@tsql, @params, @include_browse_information)

Beispiel

Hier ist ein Beispiel zur Veranschaulichung.

SELECT * 
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT * FROM Artists', 
    null, 
    0
);

Ergebnis:

+-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+
| is_hidden   | column_ordinal   | name       | is_nullable   | system_type_id   | system_type_name   | max_length   | precision   | scale   | collation_name               | user_type_id   | user_type_database   | user_type_schema   | user_type_name   | assembly_qualified_type_name   | xml_collection_id   | xml_collection_database   | xml_collection_schema   | xml_collection_name   | is_xml_document   | is_case_sensitive   | is_fixed_length_clr_type   | source_server   | source_database   | source_schema   | source_table   | source_column   | is_identity_column   | is_part_of_unique_key   | is_updateable   | is_computed_column   | is_sparse_column_set   | ordinal_in_order_by_list   | order_by_is_descending   | order_by_list_length   | error_number   | error_severity   | error_state   | error_message   | error_type   | error_type_desc   |
|-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------|
| 0           | 1                | ArtistId   | 0             | 56               | int                | 4            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | NULL              | NULL            | NULL           | NULL            | 1                    | NULL                    | 0               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
| 0           | 2                | ArtistName | 0             | 231              | nvarchar(255)      | 510          | 0           | 0       | SQL_Latin1_General_CP1_CI_AS | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | NULL              | NULL            | NULL           | NULL            | 0                    | NULL                    | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
| 0           | 3                | ActiveFrom | 1             | 40               | date               | 3            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | NULL              | NULL            | NULL           | NULL            | 0                    | NULL                    | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
+-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+

Diese Funktion gibt ziemlich viele Spalten zurück, also müssen Sie wahrscheinlich seitwärts scrollen, um alle zu sehen. Sehen Sie sich gerne die Microsoft-Dokumentation an, um eine Erklärung zu jeder zurückgegebenen Spalte zu erhalten.

Browse-Modus

Das dritte Argument – ​​@include_browse_information – gibt an, ob zusätzliche Schlüsselspalten und Quelltabelleninformationen zurückgegeben werden.

Die folgenden Werte werden für dieses Argument akzeptiert:

Wert Ergebnis
0 Es werden keine Informationen zurückgegeben.
1 Jede Abfrage wird so analysiert, als ob sie einen FOR BROWSE enthält Option in der Abfrage. Dadurch werden Basistabellennamen als Quellspalteninformationen zurückgegeben.
2 Jede Abfrage wird so analysiert, als ob sie zur Vorbereitung oder Ausführung eines Cursors verwendet würde. Dadurch werden Ansichtsnamen als Quellspalteninformationen zurückgegeben.

Nachfolgend finden Sie Beispiele, die veranschaulichen, wie sich jeder dieser Werte auf das Ergebnis auswirkt.

Um die Dinge übersichtlicher zu gestalten, ändere ich meine T-SQL-Anweisung so, dass nur eine Spalte zurückgegeben wird.

Ich sollte erwähnen, dass die Microsoft-Dokumentation für sys.dm_exec_describe_first_result_set bezieht sich nur auf nur zwei Werte:0 und 1 . Die Dokumentation für sp_describe_first_result_set gibt drei Werte an:0 , 1 , und 2 , wie in der obigen Tabelle aufgeführt.

Die Dokumentation für sys.dm_exec_describe_first_result_set gibt auch an, dass es denselben Algorithmus wie sp_describe_first_result_set verwendet .

Ich habe diese Funktion auch in SQL Server 2017 und SQL Server 2019 überprüft, und dieser Parameter ist eigentlich ein tinyint , was darauf hindeutet, dass es dafür ausgelegt ist, mehr als zwei Werte zu akzeptieren.

In jedem Fall enthalten die folgenden Beispiele alle drei Werte.

@include_browse_information = 0

In diesem Beispiel setze ich @include_browse_information auf 0 .

SELECT * 
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT AlbumName FROM vAlbums', 
    null, 
    0
);

Ergebnis (bei vertikaler Ausgabe):

is_hidden                    | 0
column_ordinal               | 1
name                         | AlbumName
is_nullable                  | 0
system_type_id               | 231
system_type_name             | nvarchar(255)
max_length                   | 510
precision                    | 0
scale                        | 0
collation_name               | SQL_Latin1_General_CP1_CI_AS
user_type_id                 | NULL
user_type_database           | NULL
user_type_schema             | NULL
user_type_name               | NULL
assembly_qualified_type_name | NULL
xml_collection_id            | NULL
xml_collection_database      | NULL
xml_collection_schema        | NULL
xml_collection_name          | NULL
is_xml_document              | 0
is_case_sensitive            | 0
is_fixed_length_clr_type     | 0
source_server                | NULL
source_database              | NULL
source_schema                | NULL
source_table                 | NULL
source_column                | NULL
is_identity_column           | 0
is_part_of_unique_key        | NULL
is_updateable                | 1
is_computed_column           | 0
is_sparse_column_set         | 0
ordinal_in_order_by_list     | NULL
order_by_is_descending       | NULL
order_by_list_length         | NULL
error_number                 | NULL
error_severity               | NULL
error_state                  | NULL
error_message                | NULL
error_type                   | NULL
error_type_desc              | NULL

Beachten Sie, dass einige Spalten NULL sind . Beachten Sie insbesondere, dass die Datei source_database , source_schema , source_table und source_column Spalten sind NULL .

Diese Spalten sind nicht NULL in den nächsten beiden Beispielen, sie werden jedoch zwei unterschiedliche Ergebnisse erzeugen.

@include_browse_information = 1

In diesem Beispiel setze ich @include_browse_information zu 1 .

SELECT * 
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT AlbumName FROM vAlbums', 
    null, 
    1
);

Einstellen von @include_browse_information zu 1 gibt das Ergebnis zurück, als ob es ein FOR BROWSE enthält Option in der Abfrage.

In unserem Fall führt dies nun dazu, dass vier Zeilen zurückgegeben werden (die vier Spalten aus den Basistabellen darstellen).

Hier sind die vier zurückgegebenen Zeilen:

+-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+
| is_hidden   | column_ordinal   | name      | is_nullable   | system_type_id   | system_type_name   | max_length   | precision   | scale   | collation_name               | user_type_id   | user_type_database   | user_type_schema   | user_type_name   | assembly_qualified_type_name   | xml_collection_id   | xml_collection_database   | xml_collection_schema   | xml_collection_name   | is_xml_document   | is_case_sensitive   | is_fixed_length_clr_type   | source_server   | source_database   | source_schema   | source_table   | source_column   | is_identity_column   | is_part_of_unique_key   | is_updateable   | is_computed_column   | is_sparse_column_set   | ordinal_in_order_by_list   | order_by_is_descending   | order_by_list_length   | error_number   | error_severity   | error_state   | error_message   | error_type   | error_type_desc   |
|-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------|
| 0           | 1                | AlbumName | 0             | 231              | nvarchar(255)      | 510          | 0           | 0       | SQL_Latin1_General_CP1_CI_AS | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | Homer           | Music             | dbo             | Albums         | AlbumName       | 0                    | 0                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
| 1           | 2                | ArtistId  | 0             | 56               | int                | 4            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | Homer           | Music             | dbo             | Artists        | ArtistId        | 0                    | 1                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
| 1           | 3                | AlbumId   | 0             | 56               | int                | 4            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | Homer           | Music             | dbo             | Albums         | AlbumId         | 0                    | 1                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
| 1           | 4                | GenreId   | 0             | 56               | int                | 4            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | Homer           | Music             | dbo             | Genres         | GenreId         | 0                    | 1                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
+-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+

Obwohl ich also nur eine Spalte in der T-SQL-Abfrage angegeben habe, die ich an die Prozedur übergeben habe, wurden Informationen für vier Spalten zurückgegeben. Dies sind die vier Spalten, die von den vAlbums referenziert werden ansehen.

Wenn Sie weit genug seitwärts scrollen, sehen Sie, dass die source_database , source_schema , source_table und source_column Spalten sind nicht mehr NULL . Der source_server auch nicht Säule. Sie liefern Informationen über die von der Ansicht abgefragten Basisobjekte.

Um es einfacher zu sehen, verwenden wir die vertikale Ausgabe in nur einer Zeile (die eine Spalte darstellt):

is_hidden                    | 0
column_ordinal               | 1
name                         | AlbumName
is_nullable                  | 0
system_type_id               | 231
system_type_name             | nvarchar(255)
max_length                   | 510
precision                    | 0
scale                        | 0
collation_name               | SQL_Latin1_General_CP1_CI_AS
user_type_id                 | NULL
user_type_database           | NULL
user_type_schema             | NULL
user_type_name               | NULL
assembly_qualified_type_name | NULL
xml_collection_id            | NULL
xml_collection_database      | NULL
xml_collection_schema        | NULL
xml_collection_name          | NULL
is_xml_document              | 0
is_case_sensitive            | 0
is_fixed_length_clr_type     | 0
source_server                | Homer
source_database              | Music
source_schema                | dbo
source_table                 | Albums
source_column                | AlbumName
is_identity_column           | 0
is_part_of_unique_key        | 0
is_updateable                | 1
is_computed_column           | 0
is_sparse_column_set         | 0
ordinal_in_order_by_list     | NULL
order_by_is_descending       | NULL
order_by_list_length         | NULL
error_number                 | NULL
error_severity               | NULL
error_state                  | NULL
error_message                | NULL
error_type                   | NULL
error_type_desc              | NULL

Wir können sehen, dass der source_server , source_database , source_schema , source_table und source_column Spalten bieten jetzt Informationen über den zugrunde liegenden Server, die Datenbank, das Schema, die Tabelle und die Spalten, auf die in der Ansicht verwiesen wird.

In meinem Fall fragt meine Ansicht Tabellen über einen Verbindungsserver ab. Daher befinden sich die Basistabellen in einer anderen Datenbank auf einem anderen Server.

Im Gegensatz dazu setzen wir @include_browse_information zu 2 Im nächsten Beispiel erhalten wir die tatsächlichen Spalten in der Ansicht.

@include_browse_information = 2

Schließlich setzen wir @include_browse_information zu 2 .

SELECT * 
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT AlbumName FROM vAlbums', 
    null, 
    2
);

In diesem Fall wird die Abfrage so analysiert, als ob sie zum Vorbereiten oder Ausführen eines Cursors verwendet würde.

Diesmal werden nur zwei Zeilen zurückgegeben:

+-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+
| is_hidden   | column_ordinal   | name      | is_nullable   | system_type_id   | system_type_name   | max_length   | precision   | scale   | collation_name               | user_type_id   | user_type_database   | user_type_schema   | user_type_name   | assembly_qualified_type_name   | xml_collection_id   | xml_collection_database   | xml_collection_schema   | xml_collection_name   | is_xml_document   | is_case_sensitive   | is_fixed_length_clr_type   | source_server   | source_database   | source_schema   | source_table   | source_column   | is_identity_column   | is_part_of_unique_key   | is_updateable   | is_computed_column   | is_sparse_column_set   | ordinal_in_order_by_list   | order_by_is_descending   | order_by_list_length   | error_number   | error_severity   | error_state   | error_message   | error_type   | error_type_desc   |
|-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------|
| 0           | 1                | AlbumName | 0             | 231              | nvarchar(255)      | 510          | 0           | 0       | SQL_Latin1_General_CP1_CI_AS | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | Test              | dbo             | vAlbums        | AlbumName       | 0                    | 0                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
| 1           | 2                | ROWSTAT^@   | 0             | 56               | int                | 4            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | NULL              | NULL            | NULL           | NULL            | 0                    | 0                       | 0               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
+-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+

Und um Ihnen das seitliche Scrollen zu ersparen, hier die erste Zeile der vertikalen Ausgabe:

is_hidden                    | 0
column_ordinal               | 1
name                         | AlbumName
is_nullable                  | 0
system_type_id               | 231
system_type_name             | nvarchar(255)
max_length                   | 510
precision                    | 0
scale                        | 0
collation_name               | SQL_Latin1_General_CP1_CI_AS
user_type_id                 | NULL
user_type_database           | NULL
user_type_schema             | NULL
user_type_name               | NULL
assembly_qualified_type_name | NULL
xml_collection_id            | NULL
xml_collection_database      | NULL
xml_collection_schema        | NULL
xml_collection_name          | NULL
is_xml_document              | 0
is_case_sensitive            | 0
is_fixed_length_clr_type     | 0
source_server                | NULL
source_database              | Test
source_schema                | dbo
source_table                 | vAlbums
source_column                | AlbumName
is_identity_column           | 0
is_part_of_unique_key        | 0
is_updateable                | 1
is_computed_column           | 0
is_sparse_column_set         | 0
ordinal_in_order_by_list     | NULL
order_by_is_descending       | NULL
order_by_list_length         | NULL
error_number                 | NULL
error_severity               | NULL
error_state                  | NULL
error_message                | NULL
error_type                   | NULL
error_type_desc              | NULL

In diesem Beispiel die source_table -Spalte enthält den tatsächlichen Ansichtsnamen anstelle der Basistabelle und die source_database ist der Name der lokalen Datenbank, aus der ich die Ansicht abgefragt habe. Auch die source_column ist die Spalte, die ich aus der Ansicht abgefragt habe, und nicht irgendeine Spalte aus den Basistabellen.

Der @params Argument

Bisher haben wir nur den @params verwendet Argument für ist, es auf NULL zu setzen .

Wenn der SQL-Batch, den Sie analysieren, Parameter enthält, verwenden Sie @params Funktion, um diese Parameter zu deklarieren.

Dies funktioniert ähnlich wie Sie Parameter deklarieren, wenn Sie sp_executesql verwenden Verfahren.

Hier ist ein Beispiel, das einen Parameter mit @params deklariert Argument.

SELECT * 
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT ArtistName FROM Homer.Music.dbo.Artists WHERE ArtistId = @ArtistId', 
    N'@ArtistId int', 
    1
);

Ergebnis (bei vertikaler Ausgabe):

-[ RECORD 1 ]-------------------------
is_hidden                    | 0
column_ordinal               | 1
name                         | ArtistName
is_nullable                  | 0
system_type_id               | 231
system_type_name             | nvarchar(255)
max_length                   | 510
precision                    | 0
scale                        | 0
collation_name               | SQL_Latin1_General_CP1_CI_AS
user_type_id                 | NULL
user_type_database           | NULL
user_type_schema             | NULL
user_type_name               | NULL
assembly_qualified_type_name | NULL
xml_collection_id            | NULL
xml_collection_database      | NULL
xml_collection_schema        | NULL
xml_collection_name          | NULL
is_xml_document              | 0
is_case_sensitive            | 0
is_fixed_length_clr_type     | 0
source_server                | Homer
source_database              | Music
source_schema                | dbo
source_table                 | Artists
source_column                | ArtistName
is_identity_column           | 0
is_part_of_unique_key        | 0
is_updateable                | 1
is_computed_column           | 0
is_sparse_column_set         | 0
ordinal_in_order_by_list     | NULL
order_by_is_descending       | NULL
order_by_list_length         | NULL
error_number                 | NULL
error_severity               | NULL
error_state                  | NULL
error_message                | NULL
error_type                   | NULL
error_type_desc              | NULL
-[ RECORD 2 ]-------------------------
is_hidden                    | 1
column_ordinal               | 2
name                         | ArtistId
is_nullable                  | 0
system_type_id               | 56
system_type_name             | int
max_length                   | 4
precision                    | 10
scale                        | 0
collation_name               | NULL
user_type_id                 | NULL
user_type_database           | NULL
user_type_schema             | NULL
user_type_name               | NULL
assembly_qualified_type_name | NULL
xml_collection_id            | NULL
xml_collection_database      | NULL
xml_collection_schema        | NULL
xml_collection_name          | NULL
is_xml_document              | 0
is_case_sensitive            | 0
is_fixed_length_clr_type     | 0
source_server                | Homer
source_database              | Music
source_schema                | dbo
source_table                 | Artists
source_column                | ArtistId
is_identity_column           | 0
is_part_of_unique_key        | 1
is_updateable                | 1
is_computed_column           | 0
is_sparse_column_set         | 0
ordinal_in_order_by_list     | NULL
order_by_is_descending       | NULL
order_by_list_length         | NULL
error_number                 | NULL
error_severity               | NULL
error_state                  | NULL
error_message                | NULL
error_type                   | NULL
error_type_desc              | NULL