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í.