Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So definieren Sie die von einer gespeicherten Prozedur in SQL Server zurückgegebenen Spalten neu

Wenn Sie eine gespeicherte Prozedur ausführen, die eine Ergebnismenge in SQL Server zurückgibt, werden die zurückgegebenen Spalten in der gespeicherten Prozedur definiert.

Aber wussten Sie, dass Sie diese Spalten neu definieren können?

Was ich meine ist, dass Sie die Namen und/oder den Datentyp der Spalten ändern können, die in der Ergebnismenge zurückgegeben werden.

Dies könnte Ihnen das Herumhantieren mit den Spaltenüberschriften und Datenformaten ersparen, falls Sie diese Ergebnismenge in einer anderen Einstellung verwenden müssen.

Wenn beispielsweise eine gespeicherte Prozedur ein datetime2 zurückgibt Spalte, aber Sie benötigen nur den Datumsteil, könnten Sie date angeben für diese Spalte, und Ihre Ergebnismenge enthält nur den Datumsteil.

Und das Beste daran ist, dass Sie dies als Teil von EXECUTE tun können Erklärung. Keine Notwendigkeit, die Daten nach Ausführung des Verfahrens zu massieren. Eine Möglichkeit, dies zu tun, ist die Verwendung von WITH RESULT SETS -Klausel von EXECUTE Erklärung.

Beispiel

Hier ist ein Beispiel, um zu demonstrieren, wie man WITH RESULT SETS verwendet -Klausel zum Ändern der Spaltennamen und Datentypen aus der Ergebnismenge einer gespeicherten Prozedur.

Rohergebnisse

Sehen wir uns zunächst die Rohergebnisse einer gespeicherten Prozedur an.

EXEC sp_getCityById @CityId = 1;

Ergebnis:

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

Abhängig von unseren Anforderungen möchten wir vielleicht, dass die Prozedur keinen so langen Spaltenkopf für die Bevölkerung verwendet (LatestRecordedPopulation ).

Wir könnten auch wünschen, dass die ValidFrom Die Spalte enthält nicht den Zeitteil, da er unnötig Platz beansprucht und für unseren speziellen Zweck nicht wichtig ist.

Vielleicht möchten wir auch die Spaltenüberschriften mit einem Leerzeichen versehen, damit es für denjenigen, an den wir es senden, etwas ansprechender aussieht.

Spalten neu definieren

Lassen Sie uns jetzt fortfahren und die WITH RESULT SETS verwenden -Klausel, um die Spalten neu zu definieren.

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

Ergebnis:

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

Also mit dem WITH RESULT SETS -Klausel konnten wir die Spaltennamen und den Datentyp ändern.

Tatsächlich habe ich in diesem Beispiel den Datentyp der letzten beiden Spalten von bigint geändert zu int , und von datetime2(7) bis Datum .

Analysieren Sie die Ergebnismengen

Wir können dynamische Verwaltungsansichten wie sys.dm_exec_describe_first_result_set verwenden und sys.dm_exec_describe_first_result_set_for_object um die tatsächlichen Datentypen jeder Ergebnismenge herauszufinden.

Hier ist ein Beispiel für die Verwendung von sys.dm_exec_describe_first_result_set_for_object um die Spaltennamen und ihre jeweiligen Datentypen abzurufen, die von der gespeicherten Prozedur zurückgegeben werden.

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

Ergebnis:

+--------------------------+--------------------+--------------+-------------+---------+------------------+
| 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             |
+--------------------------+--------------------+--------------+-------------+---------+------------------+

Dies sind also die tatsächlichen Spaltennamen und Datentypen, die in der Ergebnismenge zurückgegeben werden (ohne etwas neu zu definieren).

Wir können sehen, dass die letzten beiden Spalten bigint sind und datetime2(7) bzw..

Lassen Sie uns nun sys.dm_exec_describe_first_result_set verwenden um die Metadaten für unsere modifizierte Abfrage zu erhalten.

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

Ergebnis:

+------------+--------------------+--------------+-------------+---------+------------------+
| 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             |
+------------+--------------------+--------------+-------------+---------+------------------+

Wir können also sehen, dass sich die Spaltennamen geändert haben, und die Datentypen der letzten beiden Spalten haben sich ebenfalls wie angegeben geändert.

Mehrere Ergebnissätze

Einige gespeicherte Prozeduren geben mehrere Resultsets zurück. Bei Verwendung von WITH RESULT SETS Bei diesen Prozeduren müssen Sie sicherstellen, dass Sie Definitionen für jede Ergebnismenge einschließen.

Sie können nicht nur einige neu definieren, aber nicht die anderen. Wenn Sie das tun, erhalten Sie eine Fehlermeldung.

Wenn Sie nur eine Ergebnismenge neu definieren müssen, müssen Sie alle tun – selbst wenn ihre Definitionen dieselben wie ihre ursprüngliche Definition bleiben.

Trennen Sie dabei jede Definition durch ein Komma.

Ursprüngliche Ergebnissätze

Die folgende Prozedur gibt drei Ergebnismengen zurück.

EXEC sp_getCityStateCountryByCityId @CityId = 1;

Ergebnis:

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

Neu definierte Ergebnismengen

Wir können diese Ergebnismengen mit dem folgenden Code neu definieren.

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

Ergebnis:

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

Reduzieren der Anzahl der von der gespeicherten Prozedur zurückgegebenen Spalten

Als ich zum ersten Mal von den WITH RESULT SETS erfuhr -Klausel war ich begeistert, weil ich dachte, dass sie eine einfache Möglichkeit bieten würde, die Anzahl der von der gespeicherten Prozedur zurückgegebenen Spalten zu reduzieren.

Leider ist das nicht der Fall.

Wenn Sie nicht alle von der gespeicherten Prozedur zurückgegebenen Spalten in Ihre WITH RESULT SETS aufnehmen -Klausel erhalten Sie eine Fehlermeldung.

Es ist jedoch nicht alles verloren. Siehe So wählen Sie eine Teilmenge von Spalten aus einer gespeicherten Prozedur aus, wenn Sie weniger Spalten wünschen, als die Prozedur zurückgibt.