Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ermitteln Sie den Datentyp der Spalten, die in einem Resultset in SQL Server zurückgegeben werden

In SQL Server gibt es mehrere Möglichkeiten, Metadaten der Ergebnismenge einer Abfrage abzurufen. Dazu gehört der Datentyp der Spalten, die von einer T-SQL-Abfrage zurückgegeben werden.

Insbesondere das sys.dm_exec_describe_first_result_set System Dynamic Management-Funktion ist eine gute Wahl für eine solche Aufgabe.

Beispiel

Hier ist ein Beispiel zur Veranschaulichung der Verwendung von sys.dm_exec_describe_first_result_set zum Abrufen von Datentypinformationen zu jeder Spalte, die von einer bestimmten T-SQL-Abfrage zurückgegeben wird.

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

Ergebnis:

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

In diesem Fall werden drei Zeilen zurückgegeben, von denen jede eine Spalte darstellt, die von der von mir analysierten Abfrage zurückgegeben würde.

Sie haben vielleicht bemerkt, dass eine der Spalten einen benutzerdefinierten Datentyp-Alias ​​namens clientcode verwendet . Wenn Sie einen benutzerdefinierten Datentypalias erstellen, basieren Sie ihn auf einem vorhandenen Systemtyp. Dies spiegelt sich im obigen Ergebnis wieder. Wir können diesen Clientcode sehen basiert auf varchar(8) .

Das sys.dm_exec_describe_first_result_set Die Funktion gibt viele Spalten zurück, Sie können also gerne alle Spalten einbeziehen, um zu sehen, ob es andere gibt, die Sie nützlich finden könnten. Siehe auch Wie sys.dm_exec_describe_first_result_set Werke für eine ausführlichere Erklärung und weitere Beispiele.

Sie können auch das sp_describe_first_result_set verwenden gespeicherte Systemprozedur, um dieselben Informationen zurückzugeben (sie verwendet denselben Algorithmus wie sys.dm_exec_describe_first_result_set ).

Ergebnissätze gespeicherter Prozeduren

Wenn Sie den Datentyp der Spalten abrufen möchten, die von einer gespeicherten Prozedur zurückgegeben werden, können Sie sys.dm_exec_describe_first_result_set_for_object verwenden Funktion.

Diese Funktion verwendet denselben Algorithmus wie die vorherige, aber der Unterschied besteht darin, dass diese die ID einer gespeicherten Prozedur oder eines Triggers als erstes Argument akzeptiert (anstelle des eigentlichen T-SQL-Stapels).

Daher können wir es wie folgt verwenden:

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

Ergebnis:

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

In diesem Fall habe ich die OBJECT_ID() verwendet Funktion, um die ID der gespeicherten Prozedur zurückzugeben, was mir die Kenntnis der tatsächlichen ID ersparte.

Weitere Informationen und Beispiele für diese Funktion finden Sie unter Funktionsweise von sys.dm_exec_describe_first_result_set_for_object.