В SQL Server sys.dm_exec_describe_first_result_set
функцията за динамично управление връща метаданните на първия набор от резултати за даден T-SQL израз или изрази.
Тази функция използва същия алгоритъм като sp_describe_first_result_set
системна съхранена процедура и прави почти същото нещо.
Той приема три параметъра, първият от които е изразът/ите на T-SQL, който анализирате.
Синтаксис
Синтаксисът е така:
sys.dm_exec_describe_first_result_set(@tsql, @params, @include_browse_information)
Пример
Ето пример за демонстрация.
SELECT *
FROM sys.dm_exec_describe_first_result_set(
N'SELECT * FROM Artists',
null,
0
);
Резултат:
+-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+ | 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 | +-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+
Тази функция връща доста колони, така че вероятно ще трябва да превъртите настрани, за да видите всички. Чувствайте се свободни да разгледате документацията на Microsoft за обяснение на всяка върната колона.
Режим на разглеждане
Третият аргумент – @include_browse_information
– указва дали се връщат допълнителни ключови колони и информация за изходната таблица.
За този аргумент се приемат следните стойности:
Стойност | Резултат |
---|---|
0 | Не се връща информация. |
1 | Всяка заявка се анализира така, сякаш включва FOR BROWSE опция в заявката. Това ще върне имената на базовите таблици като информация за колоната източник. |
2 | Всяка заявка се анализира така, сякаш ще бъде използвана за подготовка или изпълнение на курсор. Това ще върне имената на изгледи като информация за колоната на източника. |
По-долу са дадени примери, които илюстрират как всяка от тези стойности влияе на резултата.
За да направя нещата по-сбити, ще модифицирам моя T-SQL оператор, за да връща само една колона.
Трябва да спомена, че документацията на Microsoft за sys.dm_exec_describe_first_result_set
се отнася само до две стойности:0
и 1
. Въпреки това, документацията за sp_describe_first_result_set
определя три стойности:0
, 1
и 2
, както е посочено в таблицата по-горе.
Документацията за sys.dm_exec_describe_first_result_set
също така заявява, че използва същия алгоритъм като sp_describe_first_result_set
.
Проверих също тази функция както в SQL Server 2017, така и в SQL Server 2019 и този параметър всъщност е tinyint , което предполага, че е проектиран да приема повече от две стойности.
Така или иначе, следващите примери включват и трите стойности.
@include_browse_information = 0
В този пример зададох @include_browse_information
до 0
.
SELECT *
FROM sys.dm_exec_describe_first_result_set(
N'SELECT AlbumName FROM vAlbums',
null,
0
);
Резултат (с помощта на вертикален изход):
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
Забележете, че доста колони са NULL
. По-специално, обърнете внимание, че source_database
, source_schema
, source_table
и source_column
колоните са NULL
.
Тези колони няма да са NULL
в следващите два примера, но те ще дадат два различни резултата.
@include_browse_information = 1
В този пример зададох @include_browse_information
до 1
.
SELECT *
FROM sys.dm_exec_describe_first_result_set(
N'SELECT AlbumName FROM vAlbums',
null,
1
);
Настройка @include_browse_information
до 1
връща резултата, сякаш включва FOR BROWSE
опция в заявката.
В нашия случай това вече води до връщане на четири реда (представляващи четири колони от базовите таблици).
Ето четирите върнати реда:
+-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+ | 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 | +-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+
Така че, въпреки че посочих само една колона в T-SQL заявката, която предадох на процедурата, тя върна информация за четири колони. Това са четирите колони, които се препращат от vAlbums
изглед.
Ако превъртите настрани достатъчно далеч, ще видите, че source_database
, source_schema
, source_table
и source_column
колоните вече не са NULL
. Нито source_server
колона. Те предоставят информация за базовите обекти, заявени от изгледа.
За да го видим по-лесно, нека използваме вертикален изход само на един ред (представляващ една колона):
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
Можем да видим, че source_server
, source_database
, source_schema
, source_table
и source_column
колоните вече предоставят информация за основния сървър, база данни, схема, таблица и колони, посочени в изгледа.
В моя случай изгледът ми прави заявки за таблици в свързан сървър. Следователно базовите таблици са в различна база данни, на различен сървър.
За разлика от това, когато зададем @include_browse_information
до 2
в следващия пример ще получим действителните колони в изгледа.
@include_browse_information = 2
И накрая, нека зададем @include_browse_information
до 2
.
SELECT *
FROM sys.dm_exec_describe_first_result_set(
N'SELECT AlbumName FROM vAlbums',
null,
2
);
В този случай заявката се анализира така, сякаш ще се използва за подготовка или изпълнение на курсор.
Този път се връщат само два реда:
+-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+ | 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 | +-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+
И за да ви спести от превъртане настрани, ето първия ред във вертикалния изход:
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
В този пример source_table
колоната съдържа действителното име на изглед, а не основната таблица и source_database
е името на локалната база данни, от която поисках изгледа. Също така, source_column
е колоната, която поисках от изгледа, а не която и да е колона от базовите таблици.
@params
Аргумент
So far, the only thing we’ve used the @params
argument for is to set it to NULL
.
If the SQL batch that you’re analysing contains parameters, use the @params
function to declare those parameters.
This works similar to the way you declare parameters when using the sp_executesql
procedure.
Here’s an example that declares a parameter with the @params
аргумент.
SELECT *
FROM sys.dm_exec_describe_first_result_set(
N'SELECT ArtistName FROM Homer.Music.dbo.Artists WHERE ArtistId = @ArtistId',
N'@ArtistId int',
1
);
Резултат (с помощта на вертикален изход):
-[ 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