dm_exec_describe_first_result_set_for_object cho nhiều bộ kết quả


9

Có một thủ tục tồn tại để trả về siêu dữ liệu cho tất cả các tập kết quả trong một thủ tục được lưu trữ không?

Một cái gì đó như sys.dm_exec_describe_first_result_set_for_object, nhưng cho tất cả các bộ kết quả?

Cuối cùng, tôi sẽ muốn khám phá siêu dữ liệu cho mọi kết quả được đặt trong mọi thủ tục được lưu trữ trong cơ sở dữ liệu. Bây giờ, tôi sẽ giải quyết cho các tập kết quả sys.dm_exec_describe_first_result_set_for_objectkhông thể mô tả. Đó là, tập kết quả thứ 2, 3 và Nth.

Nhìn vào việc sử dụng SQLCLR để làm điều này ngay bây giờ:

Cách lưu kết quả của một thủ tục với nhiều hơn một tập kết quả
tQueryt - Kiểm tra đơn vị DB cho SQL Server - resultInFilter.cs


3
Không, không có điều đó trong SQL Server, bạn sẽ phải viết mã để làm điều đó (và có lẽ bạn sẽ phải đoán trong rất nhiều trường hợp).
Aaron Bertrand

Câu trả lời:


3

Có một thủ tục tồn tại để trả về siêu dữ liệu cho tất cả các tập kết quả trong một thủ tục được lưu trữ không?

Không và có.

Không

Không có phương tiện T-SQL thuần túy nào để truy cập nhiều hơn tập kết quả đầu tiên. Ngay cả OPENWAYSETOPENQUERY cũng có cùng một giới hạn:

Mặc dù truy vấn có thể trả về nhiều bộ kết quả, MỞ (ROWSET | QUERY) chỉ trả về bộ đầu tiên.

Đối với hồ sơ, tôi không nói và cũng không ngụ ý rằng có bất kỳ lý do kỹ thuật phổ biến nào cho giới hạn này. Tôi chỉ chỉ ra rằng hạn chế là không giới hạn sp_describe_first_result_set, sys.dm_exec_describe_first_result_setsys.dm_exec_describe_first_result_set_for_object.

Đúng

Cách duy nhất để nắm bắt thông tin - tập dữ liệu meta và thậm chí kết quả - cho tập kết quả 2 - n là thông qua mã ứng dụng. Trước tiên, bạn sẽ thực thi (các) thủ tục được lưu trữ bằng cách sử dụng SqlCommand.ExecuteReader (CommandBehavior) với CommandBehavior của KeyInfo. Sau đó, bạn có thể lấy siêu dữ liệu của tập kết quả bằng cách sử dụng phương thức SqlDataReader.GetSchemaTable và gọi phương thức SqlDataReader.NextResult để quay vòng qua các tập kết quả. Chỉ cần lưu ý rằng trong khi thực hiện điều này thông qua mã ứng dụng không có giới hạn của việc không hoạt động với SQL động và các bảng tạm thời, nó thực hiệnthực sự chạy mã SQL và nếu bạn có các câu lệnh DML và chỉ muốn kết quả tập hợp dữ liệu meta mà không gây ra bất kỳ thay đổi dữ liệu nào, thì bạn sẽ phải bọc SQL mà bạn đang kiểm tra trong BEGIN TRAN/ ROLLBACK TRAN.

Loại ứng dụng có thể là Ứng dụng Windows thông thường, Ứng dụng Console, Ứng dụng web, v.v. hoặc thậm chí có thể là một hàm SQLCLR / thủ tục được lưu trữ.

Liên quan đến việc thực hiện điều này thông qua SQLCLR, một quy trình được lưu trữ đã tồn tại, thực hiện những gì được mô tả ở đây. Nó được gọi là DB_DescribeResultSets và là một phần của thư viện SQL # (mà tôi là tác giả và trong khi có phiên bản miễn phí, DB_DescribeResultSets chỉ có sẵn trong phiên bản đầy đủ).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.