Podczas wykonywania procedury składowanej, która zwraca zestaw wyników w programie SQL Server, zwracane kolumny są zdefiniowane w procedurze składowanej.
Ale czy wiesz, że możesz przedefiniować te kolumny?
Mam na myśli to, że możesz zmienić nazwy i/lub typ danych kolumn zwracanych w zestawie wyników.
Dzięki temu nie będziesz musiał manipulować nagłówkami kolumn i formatami danych w przypadku, gdy musisz użyć tego zestawu wyników w innym ustawieniu.
Na przykład, jeśli procedura składowana zwraca datetime2 kolumna, ale potrzebujesz tylko części daty, możesz określić data dla tej kolumny, a zestaw wyników będzie zawierał tylko część dotyczącą daty.
A najlepsze jest to, że możesz to zrobić w ramach EXECUTE
oświadczenie. Brak konieczności masowania danych po wykonaniu zabiegu. sposobem na to jest użycie WITH RESULT SETS
klauzula EXECUTE
oświadczenie.
Przykład
Oto przykład pokazujący, jak używać WITH RESULT SETS
klauzula do zmiany nazw kolumn i typów danych z zestawu wyników procedury składowanej.
Nieprzetworzone wyniki
Najpierw spójrzmy na nieprzetworzone wyniki procedury składowanej.
EXEC sp_getCityById @CityId = 1;
Wynik:
+------------+----------------------------+-----------------------------+ | CityName | LatestRecordedPopulation | ValidFrom | |------------+----------------------------+-----------------------------| | Aaronsburg | 613 | 2013-01-01 00:00:00.0000000 | +------------+----------------------------+-----------------------------+
W zależności od naszych wymagań, możemy chcieć, aby procedura nie używała tak długiego nagłówka kolumny dla populacji (LatestRecordedPopulation
).
Możemy również życzyć sobie, aby ValidFrom
kolumna nie zawierała części czasu, ponieważ zajmuje niepotrzebnie miejsce i nie jest ważna dla naszego konkretnego celu.
Możemy również chcieć przedstawić nagłówki kolumn ze spacją, aby wyglądały nieco lepiej dla każdego, do kogo je wyślemy.
Przeprojektuj kolumny
Teraz przejdźmy dalej i użyjmy WITH RESULT SETS
klauzula, aby przedefiniować kolumny.
EXEC sp_getCityById @CityId = 1
WITH RESULT SETS
(
(
[City] nvarchar(50),
[Population] int,
[Valid From] date
)
);
Wynik:
+------------+--------------+--------------+ | City | Population | Valid From | |------------+--------------+--------------| | Aaronsburg | 613 | 2013-01-01 | +------------+--------------+--------------+
Używając WITH RESULT SETS
klauzula, mogliśmy zmienić nazwy kolumn i typ danych.
Właściwie w tym przykładzie zmieniłem typ danych dwóch ostatnich kolumn z bigint do int i od datetime2(7) do umawiania się , odpowiednio.
Przeanalizuj zestawy wyników
Możemy użyć dynamicznych widoków zarządzania, takich jak sys.dm_exec_describe_first_result_set
i sys.dm_exec_describe_first_result_set_for_object
aby znaleźć rzeczywiste typy danych każdego zestawu wyników.
Oto przykład użycia sys.dm_exec_describe_first_result_set_for_object
aby uzyskać nazwy kolumn i odpowiadające im typy danych zwrócone przez procedurę składowaną.
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);
Wynik:
+--------------------------+--------------------+--------------+-------------+---------+------------------+ | 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 | +--------------------------+--------------------+--------------+-------------+---------+------------------+
Są to więc rzeczywiste nazwy kolumn i typy danych zwrócone w zestawie wyników (bez przedefiniowania czegokolwiek).
Widzimy, że dwie ostatnie kolumny są duże i datetime2(7) odpowiednio.
Teraz użyjmy sys.dm_exec_describe_first_result_set
aby uzyskać metadane dla naszego zmodyfikowanego zapytania.
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
);
Wynik:
+------------+--------------------+--------------+-------------+---------+------------------+ | 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 | +------------+--------------------+--------------+-------------+---------+------------------+
Widzimy więc, że nazwy kolumn uległy zmianie, a typy danych dwóch ostatnich kolumn również uległy zmianie, jak określono.
Wiele zestawów wyników
Niektóre procedury składowane zwracają wiele zestawów wyników. Podczas używania WITH RESULT SETS
w tych procedurach musisz upewnić się, że zawierasz definicje dla każdego zestawu wyników.
Nie możesz po prostu przedefiniować niektórych, ale nie innych. Jeśli to zrobisz, otrzymasz błąd.
Jeśli potrzebujesz przedefiniować tylko jeden zestaw wyników, musisz zrobić je wszystkie – nawet jeśli ich definicje pozostają takie same, jak ich pierwotna definicja.
Robiąc to, oddziel każdą definicję przecinkiem.
Oryginalne zestawy wyników
Poniższa procedura zwraca trzy zestawy wyników.
EXEC sp_getCityStateCountryByCityId @CityId = 1;
Wynik:
+------------+----------------------------+-----------------------------+ | 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)
Przedefiniowane zestawy wyników
Możemy przedefiniować te zestawy wyników za pomocą następującego kodu.
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
)
);
Wynik:
+------------+--------------+--------------+ | 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)
Zmniejszanie liczby kolumn zwracanych przez procedurę składowaną
Kiedy po raz pierwszy dowiedziałem się o WITH RESULT SETS
byłem podekscytowany, ponieważ pomyślałem, że zapewni to prosty sposób na zmniejszenie liczby kolumn zwracanych przez procedurę składowaną.
Niestety tak nie jest.
Jeśli nie uwzględnisz wszystkich kolumn zwróconych przez procedurę składowaną w swoim WITH RESULT SETS
klauzula, otrzymasz błąd.
Jednak nie wszystko jest stracone. Zobacz Jak wybrać podzbiór kolumn z procedury składowanej, jeśli chcesz mieć mniej kolumn niż zwraca procedura.