Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara Mendefinisikan Ulang Kolom yang Dikembalikan oleh Prosedur Tersimpan di SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pengantar Identitas SQL Server

  2. Memasang Instance Failover Cluster SQL Server – Bagian 1

  3. Batasan yang hanya memungkinkan satu dari dua tabel untuk mereferensikan tabel dasar

  4. Prosedur dan Izin Tersimpan - Apakah EXECUTE cukup?

  5. Bagaimana cara membuat kunci komposit dengan SQL Server Management Studio?