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.