sql >> Base de Datos >  >> RDS >> Sqlserver

Averigüe el tipo de datos de las columnas devueltas en un conjunto de resultados en SQL Server

En SQL Server, hay algunas formas de obtener metadatos del conjunto de resultados de una consulta. Esto incluye el tipo de datos de las columnas devueltas por una consulta T-SQL.

En particular, el sys.dm_exec_describe_first_result_set La función de gestión dinámica del sistema es una buena opción para esta tarea.

Ejemplo

Aquí hay un ejemplo para demostrar cómo usar sys.dm_exec_describe_first_result_set para obtener información del tipo de datos sobre cada columna devuelta por una consulta T-SQL dada.

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       |
+------------+------------------+--------------------+--------------+-------------+---------+

En este caso, se devuelven tres filas, cada una de las cuales representa una columna que devolvería la consulta que estoy analizando.

Es posible que haya notado que una de las columnas usa un alias de tipo de datos definido por el usuario llamado clientcode . Cuando crea un alias de tipo de datos definido por el usuario, lo basa en un tipo de sistema existente. Esto se refleja en el resultado anterior. Podemos ver que clientcode se basa en varchar(8) .

El sys.dm_exec_describe_first_result_set La función devuelve muchas columnas, así que siéntete libre de incluir todas las columnas para ver si hay otras que te puedan resultar útiles. Consulte también Cómo sys.dm_exec_describe_first_result_set Funciona para una explicación más detallada y más ejemplos.

También puede usar el sp_describe_first_result_set procedimiento almacenado del sistema para devolver la misma información (utiliza el mismo algoritmo que sys.dm_exec_describe_first_result_set ).

Conjuntos de resultados de procedimientos almacenados

Si desea obtener el tipo de datos de las columnas devueltas por un procedimiento almacenado, puede usar sys.dm_exec_describe_first_result_set_for_object función.

Esta función usa el mismo algoritmo que la anterior, pero la diferencia es que esta acepta la ID de un procedimiento almacenado o activador como su primer argumento (en lugar del lote T-SQL real).

Por lo tanto, podemos usarlo así:

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       |
+---------+------------------+--------------------+--------------+-------------+---------+

En este caso, utilicé el OBJECT_ID() para devolver la ID del procedimiento almacenado, lo que me salvó de tener que saber la ID real.

Consulte Cómo funciona sys.dm_exec_describe_first_result_set_for_object para obtener más información y ejemplos de esta función.