SQL Serverで結果セットを返すストアドプロシージャを実行すると、返される列はストアドプロシージャで定義されます。
しかし、これらの列を再定義できることをご存知ですか?
つまり、結果セットで返される列の名前やデータ型を変更できます。
これにより、別の設定でその結果セットを使用する必要がある場合に、列ヘッダーとデータ形式をいじる必要がなくなります。
たとえば、ストアドプロシージャが datetime2を返す場合 列ですが、必要なのは日付部分のみです。日付を指定できます その列の場合、結果セットには日付部分のみが含まれます。
そして最良の部分は、EXECUTE
の一部としてそれを実行できることです。 声明。手順の実行後にデータをマッサージする必要はありません。これを行う方法は、WITH RESULT SETS
を使用することです。 EXECUTE
の句 ステートメント。
例
WITH RESULT SETS
の使用方法を示す例を次に示します。 ストアドプロシージャの結果セットから列名とデータ型を変更する句。
生の結果
まず、ストアドプロシージャからの生の結果を見てみましょう。
EXEC sp_getCityById @CityId = 1;
結果:
+------------+----------------------------+-----------------------------+ | CityName | LatestRecordedPopulation | ValidFrom | |------------+----------------------------+-----------------------------| | Aaronsburg | 613 | 2013-01-01 00:00:00.0000000 | +------------+----------------------------+-----------------------------+
要件によっては、プロシージャで母集団にこのような長い列ヘッダーを使用しないことを希望する場合があります(LatestRecordedPopulation
。
ValidFrom
も必要になる場合があります 不要なスペースを占めるため、列には時間の部分が含まれていませんでした。特定の目的にとっては重要ではありません。
また、送信先の人に少し見やすくするために、列ヘッダーにスペースを付けて表示することもできます。
列を細かく調整する
それでは、WITH RESULT SETS
を使用してみましょう。 列を再定義する句。
EXEC sp_getCityById @CityId = 1
WITH RESULT SETS
(
(
[City] nvarchar(50),
[Population] int,
[Valid From] date
)
);
結果:
+------------+--------------+--------------+ | City | Population | Valid From | |------------+--------------+--------------| | Aaronsburg | 613 | 2013-01-01 | +------------+--------------+--------------+
したがって、WITH RESULT SETS
を使用する 句、列名とデータ型を変更することができました。
実際、この例では、最後の2つの列のデータ型を bigintから変更しました。 int 、および datetime2(7)から 日付 それぞれ。
結果セットを分析する
sys.dm_exec_describe_first_result_set
などの動的管理ビューを使用できます およびsys.dm_exec_describe_first_result_set_for_object
各結果セットの実際のデータ型を確認します。
sys.dm_exec_describe_first_result_set_for_object
の使用例を次に示します。 ストアドプロシージャによって返される列名とそれぞれのデータ型を取得します。
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);
結果:
+--------------------------+--------------------+--------------+-------------+---------+------------------+ | 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 | +--------------------------+--------------------+--------------+-------------+---------+------------------+
したがって、これらは結果セットで返される実際の列名とデータ型です(何も再定義しません)。
最後の2つの列がbigintであることがわかります およびdatetime2(7) それぞれ。
それでは、sys.dm_exec_describe_first_result_set
を使用しましょう。 変更したクエリのメタデータを取得します。
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
);
結果:
+------------+--------------------+--------------+-------------+---------+------------------+ | 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 | +------------+--------------------+--------------+-------------+---------+------------------+
したがって、列名が変更され、最後の2つの列のデータ型も指定どおりに変更されたことがわかります。
複数の結果セット
一部のストアドプロシージャは、複数の結果セットを返します。 WITH RESULT SETS
を使用する場合 これらの手順では、各結果セットの定義が含まれていることを確認する必要があります。
一部を再定義することはできませんが、他を再定義することはできません。これを行うと、エラーが発生します。
1つの結果セットのみを再定義する必要がある場合は、それらの定義が元の定義と同じままであっても、すべてを行う必要があります。
これを行うときは、各定義をコンマで区切ります。
元の結果セット
次の手順では、3つの結果セットが返されます。
EXEC sp_getCityStateCountryByCityId @CityId = 1;
結果:
+------------+----------------------------+-----------------------------+ | 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)
再定義された結果セット
これらの結果セットは、次のコードで再定義できます。
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
)
);
結果:
+------------+--------------+--------------+ | 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)
ストアドプロシージャによって返される列の数を減らす
WITH RESULT SETS
について最初に知ったとき 句、私は興奮しました。ストアドプロシージャによって返される列の数を減らす簡単な方法を提供すると思ったからです。
悲しいことに、そうではありません。
ストアドプロシージャによって返されるすべての列をWITH RESULT SETS
に含めない場合 句を指定すると、エラーが発生します。
ただし、すべてが失われるわけではありません。プロシージャが返すよりも少ない列が必要な場合は、ストアドプロシージャから列のサブセットを選択する方法を参照してください。