Ketika Anda menjalankan prosedur tersimpan yang mengembalikan hasil yang ditetapkan di SQL Server, kolom yang dikembalikan ditentukan dalam prosedur tersimpan.
Namun tahukah Anda bahwa Anda dapat mendefinisikan ulang kolom tersebut?
Yang saya maksud adalah, Anda dapat mengubah nama dan/atau tipe data kolom yang dikembalikan dalam kumpulan hasil.
Ini dapat menyelamatkan Anda dari keharusan mengutak-atik header kolom dan format data jika Anda perlu menggunakan hasil yang ditetapkan di setelan lain.
Misalnya, jika prosedur tersimpan mengembalikan datetime2 kolom, tetapi Anda hanya memerlukan bagian tanggal, Anda dapat menentukan tanggal untuk kolom itu, dan kumpulan hasil Anda hanya akan menyertakan bagian tanggal.
Dan bagian terbaiknya adalah Anda dapat melakukannya sebagai bagian dari EXECUTE
penyataan. Tidak perlu memijat data setelah menjalankan prosedur. cara melakukannya adalah dengan menggunakan WITH RESULT SETS
klausa dari EXECUTE
pernyataan.
Contoh
Berikut adalah contoh untuk mendemonstrasikan cara menggunakan WITH RESULT SETS
klausa untuk mengubah nama kolom dan tipe data dari kumpulan hasil prosedur tersimpan.
Hasil Mentah
Pertama, mari kita lihat hasil mentah dari prosedur tersimpan.
EXEC sp_getCityById @CityId = 1;
Hasil:
+------------+----------------------------+-----------------------------+ | CityName | LatestRecordedPopulation | ValidFrom | |------------+----------------------------+-----------------------------| | Aaronsburg | 613 | 2013-01-01 00:00:00.0000000 | +------------+----------------------------+-----------------------------+
Bergantung pada persyaratan kami, kami mungkin berharap prosedur tidak menggunakan header kolom yang panjang untuk populasi (LatestRecordedPopulation
).
Kami mungkin juga berharap bahwa ValidFrom
kolom tidak menyertakan bagian waktu, karena memakan ruang yang tidak perlu, dan tidak penting untuk tujuan khusus kita.
Kami mungkin juga ingin menampilkan tajuk kolom dengan spasi, hanya untuk membuatnya terlihat sedikit lebih rapi untuk siapa pun yang akan kami kirimi.
Perbaiki Kolom
Sekarang mari kita lanjutkan dan gunakan WITH RESULT SETS
klausa untuk mendefinisikan ulang kolom.
EXEC sp_getCityById @CityId = 1
WITH RESULT SETS
(
(
[City] nvarchar(50),
[Population] int,
[Valid From] date
)
);
Hasil:
+------------+--------------+--------------+ | City | Population | Valid From | |------------+--------------+--------------| | Aaronsburg | 613 | 2013-01-01 | +------------+--------------+--------------+
Jadi dengan menggunakan WITH RESULT SETS
klausa, kami dapat mengubah nama kolom dan tipe data.
Sebenarnya, dalam contoh ini saya mengubah tipe data dua kolom terakhir dari besar ke masuk , dan dari datetime2(7) sampai tanggal , masing-masing.
Analisis Kumpulan Hasil
Kita dapat menggunakan tampilan manajemen dinamis seperti sys.dm_exec_describe_first_result_set
dan sys.dm_exec_describe_first_result_set_for_object
untuk mengetahui tipe data aktual dari setiap kumpulan hasil.
Berikut ini contoh penggunaan sys.dm_exec_describe_first_result_set_for_object
untuk mendapatkan nama kolom dan tipe datanya masing-masing yang dikembalikan oleh prosedur tersimpan.
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);
Hasil:
+--------------------------+--------------------+--------------+-------------+---------+------------------+ | 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 | +--------------------------+--------------------+--------------+-------------+---------+------------------+
Jadi ini adalah nama kolom dan tipe data aktual yang dikembalikan dalam kumpulan hasil (tanpa mendefinisikan ulang apa pun).
Kita dapat melihat bahwa dua kolom terakhir besar dan datetime2(7) masing-masing.
Sekarang mari kita gunakan sys.dm_exec_describe_first_result_set
untuk mendapatkan metadata untuk kueri kami yang dimodifikasi.
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
);
Hasil:
+------------+--------------------+--------------+-------------+---------+------------------+ | 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 | +------------+--------------------+--------------+-------------+---------+------------------+
Jadi kita bisa melihat bahwa nama kolom telah berubah, dan tipe data dari dua kolom terakhir juga berubah seperti yang ditentukan.
Beberapa Kumpulan Hasil
Beberapa prosedur tersimpan mengembalikan beberapa set hasil. Saat menggunakan WITH RESULT SETS
pada prosedur ini, Anda perlu memastikan bahwa Anda menyertakan definisi untuk setiap kumpulan hasil.
Anda tidak bisa hanya mendefinisikan ulang beberapa tetapi tidak yang lain. Jika Anda melakukannya, Anda akan mendapatkan kesalahan.
Jika Anda hanya perlu mendefinisikan ulang satu kumpulan hasil, Anda perlu melakukan semuanya – meskipun definisinya tetap sama dengan definisi aslinya.
Saat melakukan ini, pisahkan setiap definisi dengan koma.
Set Hasil Asli
Prosedur berikut mengembalikan tiga set hasil.
EXEC sp_getCityStateCountryByCityId @CityId = 1;
Hasil:
+------------+----------------------------+-----------------------------+ | 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)
Set Hasil yang Didefinisikan Ulang
Kita dapat mendefinisikan ulang kumpulan hasil ini dengan kode berikut.
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
)
);
Hasil:
+------------+--------------+--------------+ | 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)
Mengurangi Jumlah Kolom yang Dikembalikan oleh Stored Procedure
Ketika saya pertama kali mengetahui tentang WITH RESULT SETS
klausa, saya senang, karena saya pikir ini akan memberikan cara sederhana untuk mengurangi jumlah kolom yang dikembalikan oleh prosedur tersimpan.
Sayangnya, bukan itu masalahnya.
Jika Anda tidak menyertakan semua kolom yang dikembalikan oleh prosedur tersimpan di WITH RESULT SETS
klausa, Anda akan mendapatkan kesalahan.
Namun, semua tidak hilang. Lihat Cara Memilih Subset Kolom dari Prosedur Tersimpan jika Anda menginginkan kolom yang lebih sedikit daripada yang dikembalikan oleh prosedur.