sql >> Databáze >  >> RDS >> Sqlserver

Jak předefinovat sloupce vrácené uloženou procedurou na serveru SQL Server

Když spustíte uloženou proceduru, která vrátí sadu výsledků na serveru SQL Server, vrácené sloupce jsou definovány v uložené proceduře.

Věděli jste ale, že tyto sloupce můžete předefinovat?

Chci říct, že můžete změnit názvy a/nebo datový typ sloupců vrácených v sadě výsledků.

To vám může ušetřit práci se záhlavími sloupců a formáty dat v případě, že byste potřebovali použít sadu výsledků v jiném nastavení.

Pokud například uložená procedura vrátí datetime2 sloupec, ale potřebujete pouze část data, můžete zadat datum pro tento sloupec a vaše sada výsledků bude obsahovat pouze část data.

A nejlepší na tom je, že to můžete udělat jako součást EXECUTE prohlášení. Po provedení procedury není potřeba masírovat data. způsob, jak toho dosáhnout, je pomocí WITH RESULT SETS klauzule EXECUTE prohlášení.

Příklad

Zde je příklad, který ukazuje, jak používat WITH RESULT SETS klauzule ke změně názvů sloupců a datových typů z výsledné sady uložené procedury.

Nezpracované výsledky

Nejprve se podívejme na nezpracované výsledky z uložené procedury.

EXEC sp_getCityById @CityId = 1;

Výsledek:

+------------+----------------------------+-----------------------------+
| CityName   | LatestRecordedPopulation   | ValidFrom                   |
|------------+----------------------------+-----------------------------|
| Aaronsburg | 613                        | 2013-01-01 00:00:00.0000000 |
+------------+----------------------------+-----------------------------+

V závislosti na našich požadavcích bychom si mohli přát, aby postup nepoužíval tak dlouhé záhlaví sloupce pro populaci (LatestRecordedPopulation ).

Můžeme si také přát, aby ValidFrom sloupec neobsahoval časovou část, protože zabírá zbytečně místo a pro náš konkrétní účel to není důležité.

Můžeme také chtít prezentovat záhlaví sloupců s mezerou, aby to vypadalo trochu lépe pro každého, komu to budeme posílat.

Upravte sloupce

Nyní pojďme do toho a použijte WITH RESULT SETS klauzule k předefinování sloupců.

EXEC sp_getCityById @CityId = 1
WITH RESULT SETS   
(  
    (
        [City] nvarchar(50),
        [Population] int,
        [Valid From] date
    )
);

Výsledek:

+------------+--------------+--------------+
| City       | Population   | Valid From   |
|------------+--------------+--------------|
| Aaronsburg | 613          | 2013-01-01   |
+------------+--------------+--------------+

Takže pomocí WITH RESULT SETS klauzule jsme byli schopni změnit názvy sloupců a datový typ.

Ve skutečnosti jsem v tomto příkladu změnil datový typ posledních dvou sloupců z bigint na int a od datetime2(7) na datum , respektive.

Analyzujte sady výsledků

Můžeme použít dynamická zobrazení správy, jako je sys.dm_exec_describe_first_result_set a sys.dm_exec_describe_first_result_set_for_object zjistit skutečné datové typy každé sady výsledků.

Zde je příklad použití sys.dm_exec_describe_first_result_set_for_object získat názvy sloupců a jejich příslušné datové typy vrácené uloženou procedurou.

SELECT 
    name,
    system_type_name,
    max_length,
    [precision],
    scale,
    user_type_name
FROM sys.dm_exec_describe_first_result_set_for_object(OBJECT_ID('sp_getCityById'), 0);

Výsledek:

+--------------------------+--------------------+--------------+-------------+---------+------------------+
| name                     | system_type_name   | max_length   | precision   | scale   | user_type_name   |
|--------------------------+--------------------+--------------+-------------+---------+------------------|
| CityName                 | nvarchar(50)       | 100          | 0           | 0       | NULL             |
| LatestRecordedPopulation | bigint             | 8            | 19          | 0       | NULL             |
| ValidFrom                | datetime2(7)       | 8            | 27          | 7       | NULL             |
+--------------------------+--------------------+--------------+-------------+---------+------------------+

Jedná se tedy o skutečné názvy sloupců a datové typy vrácené v sadě výsledků (bez předefinování).

Vidíme, že poslední dva sloupce jsou velké a datetime2(7) respektive.

Nyní použijeme sys.dm_exec_describe_first_result_set získat metadata pro náš upravený dotaz.

SELECT 
    name,
    system_type_name,
    max_length,
    [precision],
    scale,
    user_type_name
FROM sys.dm_exec_describe_first_result_set(
    'EXEC sp_getCityById @CityId = 1
        WITH RESULT SETS   
        (  
            (
                [City] nvarchar(50),
                [Population] int,
                [Valid To] date
            )
        );', 
        null, 
        0
    );

Výsledek:

+------------+--------------------+--------------+-------------+---------+------------------+
| name       | system_type_name   | max_length   | precision   | scale   | user_type_name   |
|------------+--------------------+--------------+-------------+---------+------------------|
| City       | nvarchar(50)       | 100          | 0           | 0       | NULL             |
| Population | int                | 4            | 10          | 0       | NULL             |
| Valid To   | date               | 3            | 10          | 0       | NULL             |
+------------+--------------------+--------------+-------------+---------+------------------+

Vidíme tedy, že názvy sloupců se změnily a datové typy posledních dvou sloupců se také změnily, jak je uvedeno.

Více sad výsledků

Některé uložené procedury vracejí více sad výsledků. Při použití WITH RESULT SETS v těchto postupech se musíte ujistit, že zahrnujete definice pro každou sadu výsledků.

Nemůžete předefinovat jen některé, ale ne jiné. Pokud to uděláte, zobrazí se chyba.

Pokud potřebujete předefinovat pouze jednu sadu výsledků, musíte je udělat všechny – i když jejich definice zůstanou stejné jako jejich původní definice.

Při tom oddělte každou definici čárkou.

Původní sady výsledků

Následující postup vrátí tři sady výsledků.

EXEC sp_getCityStateCountryByCityId @CityId = 1;

Výsledek:

+------------+----------------------------+-----------------------------+
| CityName   | LatestRecordedPopulation   | ValidFrom                   |
|------------+----------------------------+-----------------------------|
| Aaronsburg | 613                        | 2013-01-01 00:00:00.0000000 |
+------------+----------------------------+-----------------------------+
(1 row affected)
+---------------------+---------------------+----------------------------+
| StateProvinceCode   | StateProvinceName   | LatestRecordedPopulation   |
|---------------------+---------------------+----------------------------|
| PA                  | Pennsylvania        | 13284753                   |
+---------------------+---------------------+----------------------------+
(1 row affected)
+-----------------+---------------+----------------------------+
| IsoAlpha3Code   | CountryName   | LatestRecordedPopulation   |
|-----------------+---------------+----------------------------|
| USA             | United States | 313973000                  |
+-----------------+---------------+----------------------------+
(1 row affected)

Předefinované sady výsledků

Tyto sady výsledků můžeme předefinovat pomocí následujícího kódu.

EXEC sp_getCityStateCountryByCityId @CityId = 1
WITH RESULT SETS   
(  
    (
        [City] nvarchar(50),
        [Population] int,
        [Valid From] date
    ),
    (
        [State Code] nvarchar(5),
        [State Name] nvarchar(50),
        [Population] int
    ),
    (
        [Country Code] nvarchar(3),
        [Country Name] nvarchar(60),
        [Population] int
    )
);

Výsledek:

+------------+--------------+--------------+
| City       | Population   | Valid From   |
|------------+--------------+--------------|
| Aaronsburg | 613          | 2013-01-01   |
+------------+--------------+--------------+
(1 row affected)
+--------------+--------------+--------------+
| State Code   | State Name   | Population   |
|--------------+--------------+--------------|
| PA           | Pennsylvania | 13284753     |
+--------------+--------------+--------------+
(1 row affected)
+----------------+----------------+--------------+
| Country Code   | Country Name   | Population   |
|----------------+----------------+--------------|
| USA            | United States  | 313973000    |
+----------------+----------------+--------------+
(1 row affected)

Snížení počtu sloupců vrácených uloženou procedurou

Když jsem se poprvé dozvěděl o WITH RESULT SETS klauzule, byl jsem nadšený, protože jsem si myslel, že to poskytne jednoduchý způsob, jak snížit počet sloupců vrácených uloženou procedurou.

Bohužel tomu tak není.

Pokud do WITH RESULT SETS nezahrnete všechny sloupce vrácené uloženou procedurou klauzule, dostanete chybu.

Není však vše ztraceno. Viz Jak vybrat podmnožinu sloupců z uložené procedury, pokud chcete méně sloupců, než procedura vrací.


  1. Jak se připojit ke zdroji dat MySQL ve Visual Studiu

  2. WinRT System.Data – připojení k SQL

  3. Kontingenční data v T-SQL

  4. 2 způsoby, jak získat počet dní v měsíci v Oracle