Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Découvrez le type de données des colonnes renvoyées dans un jeu de résultats dans SQL Server

Dans SQL Server, il existe plusieurs façons d'obtenir les métadonnées du jeu de résultats à partir d'une requête. Cela inclut le type de données des colonnes renvoyées par une requête T-SQL.

En particulier, le sys.dm_exec_describe_first_result_set la fonction de gestion dynamique du système est un bon choix pour une telle tâche.

Exemple

Voici un exemple pour montrer comment utiliser sys.dm_exec_describe_first_result_set pour obtenir des informations sur le type de données de chaque colonne renvoyée par une requête T-SQL donnée.

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);

Résultat :

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

Dans ce cas, trois lignes sont renvoyées, chacune représentant une colonne qui serait renvoyée par la requête que j'analyse.

Vous avez peut-être remarqué que l'une des colonnes utilise un alias de type de données défini par l'utilisateur appelé clientcode . Lorsque vous créez un alias de type de données défini par l'utilisateur, vous le basez sur un type de système existant. Cela se reflète dans le résultat ci-dessus. Nous pouvons voir que clientcode est basé sur varchar(8) .

Le sys.dm_exec_describe_first_result_set La fonction renvoie beaucoup de colonnes, alors n'hésitez pas à inclure toutes les colonnes pour voir s'il y en a d'autres que vous pourriez trouver utiles. Voir aussi Comment sys.dm_exec_describe_first_result_set Fonctionne pour une explication plus détaillée et plus d'exemples.

Vous pouvez également utiliser le sp_describe_first_result_set procédure stockée système pour renvoyer les mêmes informations (elle utilise le même algorithme que sys.dm_exec_describe_first_result_set ).

Ensembles de résultats de procédure stockée

Si vous souhaitez obtenir le type de données des colonnes renvoyées par une procédure stockée, vous pouvez utiliser le sys.dm_exec_describe_first_result_set_for_object fonction.

Cette fonction utilise le même algorithme que la précédente, mais la différence est que celle-ci accepte l'ID d'une procédure stockée ou d'un déclencheur comme premier argument (au lieu du lot T-SQL réel).

Par conséquent, nous pouvons l'utiliser comme ceci :

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);

Résultat :

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

Dans ce cas, j'ai utilisé le OBJECT_ID() fonction pour renvoyer l'ID de la procédure stockée, ce qui m'a évité d'avoir à connaître l'ID réel.

Voir Fonctionnement de sys.dm_exec_describe_first_result_set_for_object pour plus d'informations et des exemples pour cette fonction.