sql >> Databasteknik >  >> RDS >> Sqlserver

Ta reda på datatypen för kolumnerna som returneras i en resultatuppsättning i SQL Server

I SQL Server finns det några sätt att få metadata för resultatuppsättningen från en fråga. Detta inkluderar datatypen för kolumnerna som returneras av en T-SQL-fråga.

I synnerhet sys.dm_exec_describe_first_result_set system dynamisk hanteringsfunktion är ett bra val för en sådan uppgift.

Exempel

Här är ett exempel för att visa hur du använder sys.dm_exec_describe_first_result_set för att få datatypsinformation om varje kolumn som returneras av en given T-SQL-fråga.

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

Resultat:

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

I det här fallet returneras tre rader, som var och en representerar en kolumn som skulle returneras av frågan som jag analyserar.

Du kanske har märkt att en av kolumnerna använder ett användardefinierat datatypalias som heter klientkod . När du skapar ett användardefinierat datatypalias baserar du det på en befintlig systemtyp. Detta återspeglas i resultatet ovan. Vi kan se den klientkoden är baserad på varchar(8) .

sys.dm_exec_describe_first_result_set funktionen returnerar många kolumner, så inkludera gärna alla kolumner för att se om det finns några andra du kan ha nytta av. Se även hur sys.dm_exec_describe_first_result_set Fungerar för en mer detaljerad förklaring och fler exempel.

Du kan också använda sp_describe_first_result_set systemlagrad procedur för att returnera samma information (den använder samma algoritm som sys.dm_exec_describe_first_result_set ).

Lagrade procedurresultatuppsättningar

Om du vill få datatypen för kolumnerna returnerad av en lagrad procedur kan du använda sys.dm_exec_describe_first_result_set_for_object funktion.

Den här funktionen använder samma algoritm som den föregående, men skillnaden är att den här accepterar ID:t för en lagrad procedur eller trigger som dess första argument (istället för den faktiska T-SQL-batchen).

Därför kan vi använda det så här:

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

Resultat:

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

I det här fallet använde jag OBJECT_ID() funktion för att returnera ID:t för den lagrade proceduren, vilket räddade mig från att behöva känna till det faktiska ID:t.

Se Hur sys.dm_exec_describe_first_result_set_for_object fungerar för mer information och exempel för den här funktionen.


  1. #1055 - Uttrycket av SELECT-listan finns inte i GROUP BY-satsen och innehåller en icke-aggregerad kolumn som är inkompatibel med sql_mode=only_full_group_by

  2. MySQL-sökning i kommalista

  3. Ersätt en sträng med en annan sträng i SQL Server (T-SQL)

  4. Hämta en bild lagrad som BLOB på en MYSQL DB