No SQL Server, o
sp_describe_first_result_set
procedimento armazenado do sistema retorna os metadados para um conjunto de resultados. Mais especificamente, ele retorna os metadados para o primeiro conjunto de resultados possível de um lote T-SQL.
Ele aceita três parâmetros, sendo o primeiro a(s) instrução(ões) T-SQL que você está analisando.
Exemplo
Aqui está um exemplo para demonstrar.
EXEC sp_describe_first_result_set
@tsql = N'SELECT * FROM Artists',
@params = null,
@browse_information_mode = 0;
Esse código nomeia explicitamente cada um dos três parâmetros que esse procedimento armazenado aceita.
Apenas o primeiro parâmetro é necessário. Além disso, como em qualquer procedimento armazenado, você pode omitir os nomes dos parâmetros, se preferir.
Assim, também poderíamos usar o seguinte código:
EXEC sp_describe_first_result_set N'SELECT * FROM Artists';
E aqui está o resultado:
+-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+ | 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 | tds_type_id | tds_length | tds_collation_id | tds_collation_sort_id | |-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------| | 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 | 56 | 4 | 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 | 231 | 510 | 13632521 | 52 | | 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 | 40 | 3 | NULL | NULL | +-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+
Há muitas colunas retornadas com este procedimento armazenado (consulte os documentos da Microsoft para obter uma explicação de cada), portanto, você provavelmente precisará rolar para os lados para ver todas elas.
Vou mudar para saída vertical em alguns dos meus próximos exemplos, caso você tenha problemas para rolar para os lados.
Modo de navegação
O terceiro argumento –
@browse_information_mode
– especifica se colunas de chave adicionais e informações da tabela de origem são retornadas. Os seguintes valores são aceitos para este argumento:
Valor | Resultado |
---|---|
0 | Nenhuma informação é retornada. |
1 | Cada consulta é analisada como se incluísse um FOR BROWSE opção na consulta. Isso retornará os nomes das tabelas base como as informações da coluna de origem. |
2 | Cada consulta é analisada como se fosse usada na preparação ou execução de um cursor. Isso retornará os nomes das visualizações como informações da coluna de origem. |
Abaixo estão exemplos que ilustram como cada um desses valores afeta o resultado.
Para tornar as coisas mais concisas, modificarei minha instrução T-SQL para retornar apenas uma coluna. Também exibirei os resultados usando a saída vertical para evitar que você tenha que rolar para os lados.
@browse_information_mode = 0
Neste exemplo eu configurei
@browse_information_mode
para 0
. EXEC sp_describe_first_result_set
@tsql = N'SELECT AlbumName FROM vAlbums',
@params = null,
@browse_information_mode = 0;
Como mencionado anteriormente, você pode alternativamente omitir os nomes dos parâmetros, se preferir. Portanto, poderíamos usar o código a seguir como uma maneira mais concisa de fazer a mesma coisa.
EXEC sp_describe_first_result_set N'SELECT AlbumName FROM vAlbums', null, 0;
Resultado (usando saída vertical):
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 tds_type_id | 231 tds_length | 510 tds_collation_id | 13632521 tds_collation_sort_id | 52
Observe que algumas colunas são
NULL
. Em particular, observe que o source_database
, source_schema
, source_table
e source_column
as colunas são NULL
. Essas colunas não serão
NULL
nos próximos dois exemplos, mas eles produzirão dois resultados diferentes. @browse_information_mode = 1
Neste exemplo eu configurei
@browse_information_mode
para 1
. EXEC sp_describe_first_result_set
N'SELECT AlbumName FROM vAlbums', null, 1;
Configurando
@browse_information_mode
para 1
retorna o resultado como se incluísse um FOR BROWSE
opção na consulta. Em nosso caso, isso resulta em quatro linhas sendo retornadas (representando quatro colunas das tabelas base).
Aqui estão as quatro linhas retornadas:
+-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+ | 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 | tds_type_id | tds_length | tds_collation_id | tds_collation_sort_id | |-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------| | 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 | Music | dbo | Albums | AlbumName | 0 | 0 | 1 | 0 | 0 | NULL | NULL | NULL | 231 | 510 | 13632521 | 52 | | 1 | 2 | ArtistId | 0 | 56 | int | 4 | 10 | 0 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 0 | 0 | 0 | NULL | Music | dbo | Artists | ArtistId | 1 | 1 | 0 | 0 | 0 | NULL | NULL | NULL | 56 | 4 | NULL | NULL | | 1 | 3 | AlbumId | 0 | 56 | int | 4 | 10 | 0 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 0 | 0 | 0 | NULL | Music | dbo | Albums | AlbumId | 1 | 1 | 0 | 0 | 0 | NULL | NULL | NULL | 56 | 4 | NULL | NULL | | 1 | 4 | GenreId | 0 | 56 | int | 4 | 10 | 0 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | 0 | 0 | 0 | NULL | Music | dbo | Genres | GenreId | 1 | 1 | 0 | 0 | 0 | NULL | NULL | NULL | 56 | 4 | NULL | NULL | +-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+
Portanto, embora eu tenha especificado apenas uma coluna na consulta T-SQL que passei para o procedimento, ele retornou informações para quatro colunas. Estas são as quatro colunas que são referenciadas pelo
vAlbums
visualizar. Vamos aprimorar apenas uma coluna usando a saída vertical:
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 | 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 tds_type_id | 231 tds_length | 510 tds_collation_id | 13632521 tds_collation_sort_id | 52
Observe que o
source_database
, source_schema
, source_table
e source_column
as colunas não são mais NULL
. Eles fornecem informações sobre os objetos base consultados pela exibição. Por outro lado, quando definimos
@browse_information_mode
para 2
no próximo exemplo, obteremos as colunas reais na exibição. Observe também que o
source_server
coluna ainda é NULL
. Isso ocorre porque o servidor local é o servidor de origem. Mas se minha visão estivesse consultando tabelas em um servidor vinculado, o nome desse servidor estaria no source_server
coluna. Consulte Como sys.dm_exec_describe_first_result_set funciona para obter um exemplo. Nesse artigo, uso uma visão semelhante à do exemplo acima, exceto que ela consulta um banco de dados em um servidor vinculado.
@browse_information_mode = 2
Por fim, vamos definir
@browse_information_mode
para 2
. EXEC sp_describe_first_result_set
N'SELECT AlbumName FROM vAlbums', null, 2;
Neste caso, a consulta é analisada como se fosse utilizada na preparação ou execução de um cursor.
Desta vez, apenas duas linhas são retornadas:
+-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+ | 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 | tds_type_id | tds_length | tds_collation_id | tds_collation_sort_id | |-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------| | 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 | Music | dbo | vAlbums | AlbumName | 0 | 0 | 1 | 0 | 0 | NULL | NULL | NULL | 231 | 510 | 13632521 | 52 | | 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 | 56 | 4 | NULL | NULL | +-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+
E para evitar que você role para os lados, aqui está a primeira linha na saída vertical:
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 | Music 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 tds_type_id | 231 tds_length | 510 tds_collation_id | 13632521 tds_collation_sort_id | 52
Neste exemplo, a
source_table
A coluna contém o nome real da exibição, em vez da tabela base. O @params
Argumento
Até agora, não usamos o
@params
argumento, além de defini-lo como NULL
. Se o lote SQL que você está analisando contiver parâmetros, use o
@params
função para declarar esses parâmetros. Isso funciona de maneira semelhante à maneira como você declara parâmetros ao usar o
sp_executesql
procedimento. Aqui está um exemplo que declara um parâmetro com o
@params
argumento. EXEC sp_describe_first_result_set
@tsql = N'SELECT AlbumName FROM Albums WHERE ArtistId = @ArtistId',
@params = N'@ArtistId int',
@browse_information_mode = 0;
Resultado (usando saída vertical):
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 tds_type_id | 231 tds_length | 510 tds_collation_id | 13632521 tds_collation_sort_id | 52