sql >> Database >  >> RDS >> Sqlserver

Ontdek het gegevenstype van de kolommen die worden geretourneerd in een resultatenset in SQL Server

In SQL Server zijn er een paar manieren om metagegevens van de resultatenset uit een query te halen. Dit omvat het gegevenstype van de kolommen die worden geretourneerd door een T-SQL-query.

In het bijzonder de sys.dm_exec_describe_first_result_set systeem dynamisch beheer is een goede keuze voor een dergelijke taak.

Voorbeeld

Hier is een voorbeeld om te demonstreren hoe u sys.dm_exec_describe_first_result_set gebruikt om gegevenstype-informatie te krijgen over elke kolom die wordt geretourneerd door een bepaalde T-SQL-query.

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

Resultaat:

+------------+------------------+--------------------+--------------+-------------+---------+
| 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 dit geval worden drie rijen geretourneerd, die elk een kolom vertegenwoordigen die zou worden geretourneerd door de query die ik aan het analyseren ben.

Het is u misschien opgevallen dat een van de kolommen een door de gebruiker gedefinieerde gegevenstype-alias gebruikt met de naam clientcode . Wanneer u een door de gebruiker gedefinieerde alias van het gegevenstype maakt, baseert u deze op een bestaand systeemtype. Dit is terug te zien in het bovenstaande resultaat. We kunnen zien dat klantcode is gebaseerd op varchar(8) .

De sys.dm_exec_describe_first_result_set functie retourneert veel kolommen, dus voel je vrij om alle kolommen op te nemen om te zien of er nog andere zijn die je misschien nuttig vindt. Zie ook Hoe sys.dm_exec_describe_first_result_set Werkt voor een meer gedetailleerde uitleg en meer voorbeelden.

U kunt ook de sp_describe_first_result_set . gebruiken systeem opgeslagen procedure om dezelfde informatie te retourneren (het gebruikt hetzelfde algoritme als sys.dm_exec_describe_first_result_set ).

Opgeslagen resultatenreeksen van procedures

Als u het gegevenstype van de kolommen wilt krijgen die door een opgeslagen procedure worden geretourneerd, kunt u de sys.dm_exec_describe_first_result_set_for_object gebruiken functie.

Deze functie gebruikt hetzelfde algoritme als de vorige, maar het verschil is dat deze de ID van een opgeslagen procedure of trigger als eerste argument accepteert (in plaats van de eigenlijke T-SQL-batch).

Daarom kunnen we het als volgt gebruiken:

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

Resultaat:

+---------+------------------+--------------------+--------------+-------------+---------+
| 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 dit geval gebruikte ik de OBJECT_ID() functie om de ID van de opgeslagen procedure terug te geven, waardoor ik de werkelijke ID niet hoefde te weten.

Zie Hoe sys.dm_exec_describe_first_result_set_for_object werkt voor meer informatie en voorbeelden voor deze functie.


  1. Verschil tussen sleutel, primaire sleutel, unieke sleutel en index in MySQL

  2. Toegang tot klassenmodule en wrapperklassen

  3. SQL JOIN versus IN-prestaties?

  4. ListView-besturing Drag-Drop Gebeurtenissen sorteren