Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Descubra o tipo de dados das colunas retornadas em um conjunto de resultados no SQL Server


No SQL Server, há algumas maneiras de obter metadados do conjunto de resultados de uma consulta. Isso inclui o tipo de dados das colunas retornadas por uma consulta T-SQL.

Em particular, o sys.dm_exec_describe_first_result_set função de gerenciamento dinâmico do sistema é uma boa escolha para tal tarefa.

Exemplo


Aqui está um exemplo para demonstrar como usar sys.dm_exec_describe_first_result_set para obter informações de tipo de dados sobre cada coluna retornada por uma determinada consulta T-SQL.
SELECT 
    name,
    user_type_name,
    system_type_name,
    max_length,
    [precision],
    scale
FROM sys.dm_exec_describe_first_result_set(
    'select * from Clients', 
    null, 
    0);

Resultado:
+------------+------------------+--------------------+--------------+-------------+---------+
| name       | user_type_name   | system_type_name   | max_length   | precision   | scale   |
|------------+------------------+--------------------+--------------+-------------+---------|
| ClientCode | clientcode       | varchar(8)         | 8            | 0           | 0       |
| FirstName  | NULL             | varchar(60)        | 60           | 0           | 0       |
| LastName   | NULL             | varchar(60)        | 60           | 0           | 0       |
+------------+------------------+--------------------+--------------+-------------+---------+

Nesse caso, três linhas são retornadas, cada uma representando uma coluna que seria retornada pela consulta que estou analisando.

Você deve ter notado que uma das colunas usa um alias de tipo de dados definido pelo usuário chamado clientcode . Ao criar um alias de tipo de dados definido pelo usuário, você o baseia em um tipo de sistema existente. Isso se reflete no resultado acima. Podemos ver que clientcode é baseado em varchar(8) .

O sys.dm_exec_describe_first_result_set A função retorna muitas colunas, portanto, sinta-se à vontade para incluir todas as colunas para ver se há outras que você possa achar úteis. Consulte também Como sys.dm_exec_describe_first_result_set Funciona para uma explicação mais detalhada e mais exemplos.

Você também pode usar o sp_describe_first_result_set procedimento armazenado do sistema para retornar as mesmas informações (ele usa o mesmo algoritmo que sys.dm_exec_describe_first_result_set ).

Conjuntos de resultados de procedimentos armazenados


Se você deseja obter o tipo de dados das colunas retornadas por um procedimento armazenado, você pode usar o sys.dm_exec_describe_first_result_set_for_object função.

Esta função usa o mesmo algoritmo que a anterior, mas a diferença é que esta aceita o ID de um procedimento armazenado ou gatilho como seu primeiro argumento (em vez do lote T-SQL real).

Portanto, podemos usá-lo assim:
SELECT 
    name,
    user_type_name,
    system_type_name,
    max_length,
    [precision],
    scale
FROM sys.dm_exec_describe_first_result_set_for_object(
    OBJECT_ID('sp_BadDogs'),
    0);

Resultado:
+---------+------------------+--------------------+--------------+-------------+---------+
| name    | user_type_name   | system_type_name   | max_length   | precision   | scale   |
|---------+------------------+--------------------+--------------+-------------+---------|
| DogId   | NULL             | int                | 4            | 10          | 0       |
| DogName | NULL             | nvarchar(255)      | 510          | 0           | 0       |
| GoodDog | NULL             | bit                | 1            | 1           | 0       |
+---------+------------------+--------------------+--------------+-------------+---------+

Neste caso, usei o OBJECT_ID() função para retornar o ID do procedimento armazenado, o que me salvou de ter que saber o ID real.

Consulte Como sys.dm_exec_describe_first_result_set_for_object funciona para obter mais informações e exemplos dessa função.