Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách xác định lại các cột được trả về bởi một thủ tục được lưu trữ trong SQL Server

Khi bạn thực thi một thủ tục được lưu trữ trả về một tập hợp kết quả trong SQL Server, các cột trả về được xác định trong thủ tục được lưu trữ.

Nhưng bạn có biết rằng bạn có thể xác định lại các cột đó không?

Ý tôi là, bạn có thể thay đổi tên và / hoặc kiểu dữ liệu của các cột được trả về trong tập kết quả.

Điều này có thể giúp bạn không phải loay hoay với các tiêu đề cột và định dạng dữ liệu trong trường hợp bạn cần sử dụng tập hợp kết quả đó trong một cài đặt khác.

Ví dụ:nếu một thủ tục được lưu trữ trả về datetime2 nhưng bạn chỉ cần phần ngày, bạn có thể chỉ định ngày cho cột đó và tập kết quả của bạn sẽ chỉ bao gồm phần ngày tháng.

Và phần tốt nhất là bạn có thể làm điều đó như một phần của EXECUTE tuyên bố. Không cần xoa bóp dữ liệu sau khi thực hiện thủ tục. cách thực hiện là sử dụng WITH RESULT SETS mệnh đề của EXECUTE tuyên bố.

Ví dụ

Dưới đây là một ví dụ để minh họa cách sử dụng WITH RESULT SETS mệnh đề để thay đổi tên cột và kiểu dữ liệu từ tập kết quả của một thủ tục được lưu trữ.

Kết quả thô

Đầu tiên, hãy xem xét các kết quả thô từ một quy trình được lưu trữ.

EXEC sp_getCityById @CityId = 1;

Kết quả:

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

Tùy thuộc vào yêu cầu của chúng tôi, chúng tôi có thể ước rằng quy trình không sử dụng tiêu đề cột dài như vậy cho tập hợp (LatestRecordedPopulation ).

Chúng tôi cũng có thể mong muốn rằng ValidFrom không bao gồm phần thời gian, vì nó chiếm dung lượng không cần thiết và không quan trọng cho mục đích cụ thể của chúng tôi.

Chúng tôi cũng có thể muốn trình bày các tiêu đề cột bằng một khoảng trắng, chỉ để làm cho nó trông dễ nhìn hơn một chút đối với bất kỳ ai mà chúng tôi sẽ gửi nó đến.

Xác định lại các cột

Bây giờ chúng ta hãy tiếp tục và sử dụng WITH RESULT SETS mệnh đề để xác định lại các cột.

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

Kết quả:

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

Vì vậy, bằng cách sử dụng WITH RESULT SETS , chúng tôi có thể thay đổi tên cột và kiểu dữ liệu.

Trên thực tế, trong ví dụ này, tôi đã thay đổi kiểu dữ liệu của hai cột cuối cùng từ bigint thành int và từ datetime2 (7) đến ngày , tương ứng.

Phân tích các tập kết quả

Chúng tôi có thể sử dụng các chế độ xem quản lý động như sys.dm_exec_describe_first_result_setsys.dm_exec_describe_first_result_set_for_object để tìm ra các loại dữ liệu thực tế của từng tập kết quả.

Đây là ví dụ về việc sử dụng sys.dm_exec_describe_first_result_set_for_object để lấy tên cột và kiểu dữ liệu tương ứng của chúng được trả về bởi thủ tục được lưu trữ.

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

Kết quả:

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

Vì vậy, đây là tên cột và kiểu dữ liệu thực tế được trả về trong tập kết quả (mà không cần xác định lại bất kỳ thứ gì).

Chúng ta có thể thấy rằng hai cột cuối cùng là bigint datetime2 (7) tương ứng.

Bây giờ, hãy sử dụng sys.dm_exec_describe_first_result_set để lấy siêu dữ liệu cho truy vấn đã sửa đổi của chúng tôi.

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

Kết quả:

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

Vì vậy, chúng ta có thể thấy rằng tên cột đã thay đổi và kiểu dữ liệu của hai cột cuối cùng cũng đã thay đổi như được chỉ định.

Nhiều Bộ Kết quả

Một số thủ tục được lưu trữ trả về nhiều tập kết quả. Khi sử dụng WITH RESULT SETS trên các quy trình này, bạn cần đảm bảo rằng bạn bao gồm các định nghĩa cho mỗi tập kết quả.

Bạn không thể chỉ xác định lại một số mà không xác định lại những cái khác. Nếu bạn làm điều đó, bạn sẽ gặp lỗi.

Nếu bạn chỉ cần xác định lại một tập hợp kết quả, bạn cần thực hiện tất cả chúng - ngay cả khi định nghĩa của chúng vẫn giống như định nghĩa ban đầu.

Khi thực hiện việc này, hãy phân tách từng định nghĩa bằng dấu phẩy.

Bộ kết quả ban đầu

Quy trình sau đây trả về ba tập kết quả.

EXEC sp_getCityStateCountryByCityId @CityId = 1;

Kết quả:

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

Bộ kết quả được xác định lại

Chúng tôi có thể xác định lại các tập kết quả này bằng mã sau.

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

Kết quả:

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

Giảm số lượng cột được trả về bởi thủ tục lưu trữ

Khi tôi lần đầu tiên biết về WITH RESULT SETS , tôi rất hào hứng, vì tôi nghĩ nó sẽ cung cấp một cách đơn giản để giảm số lượng cột được trả về bởi thủ tục được lưu trữ.

Đáng buồn thay, đó không phải là trường hợp.

Nếu bạn không bao gồm tất cả các cột được trả về bởi quy trình được lưu trữ trong WITH RESULT SETS , bạn sẽ gặp lỗi.

Tuy nhiên, tất cả là không bị mất. Xem Cách chọn Tập hợp Con của các Cột từ Thủ tục Đã Lưu trữ nếu bạn muốn ít cột hơn thủ tục trả về.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo một hàm có giá trị bảng trong SQL Server

  2. Khi nào sử dụng EXCEPT thay vì NOT EXISTS trong Transact SQL?

  3. chỉ nhóm sql theo các hàng theo trình tự

  4. 3 cách để lấy ngôn ngữ của phiên hiện tại trong SQL Server (T-SQL)

  5. Chọn COUNT (*) với DISTINCT