Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak przedefiniować kolumny zwracane przez procedurę składowaną w SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co to jest SQL Server Management Studio (SSMS)?

  2. Jak określić wartość pola, której nie można przekonwertować na (dziesiętne, zmiennoprzecinkowe, int) w SQL Server?

  3. Jak zaszyfrować procedurę składowaną w SQL Server

  4. Funkcja IndexOf w T-SQL

  5. Jak używać OBJECT_ID() na obiektach między bazami danych w SQL Server