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

Cách sp_describe_first_result_set hoạt động trong SQL Server

Trong SQL Server, sp_describe_first_result_set hệ thống lưu trữ thủ tục trả về siêu dữ liệu cho một tập hợp kết quả.

Cụ thể hơn, nó trả về siêu dữ liệu cho tập kết quả đầu tiên có thể có của một lô T-SQL.

Nó chấp nhận ba tham số, tham số đầu tiên là / các câu lệnh T-SQL mà bạn đang phân tích.

Ví dụ

Đây là một ví dụ để chứng minh.

EXEC sp_describe_first_result_set 
    @tsql = N'SELECT * FROM Artists', 
    @params = null, 
    @browse_information_mode = 0;

Mã đó đặt tên rõ ràng cho từng tham số trong số ba tham số mà thủ tục được lưu trữ này chấp nhận.

Chỉ tham số đầu tiên là bắt buộc. Ngoài ra, như với bất kỳ thủ tục được lưu trữ nào, bạn có thể bỏ qua tên tham số nếu muốn.

Vì vậy, chúng tôi cũng có thể sử dụng mã sau:

EXEC sp_describe_first_result_set N'SELECT * FROM Artists';

Và đây là kết quả:

+-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+
| is_hidden   | column_ordinal   | name       | is_nullable   | system_type_id   | system_type_name   | max_length   | precision   | scale   | collation_name               | user_type_id   | user_type_database   | user_type_schema   | user_type_name   | assembly_qualified_type_name   | xml_collection_id   | xml_collection_database   | xml_collection_schema   | xml_collection_name   | is_xml_document   | is_case_sensitive   | is_fixed_length_clr_type   | source_server   | source_database   | source_schema   | source_table   | source_column   | is_identity_column   | is_part_of_unique_key   | is_updateable   | is_computed_column   | is_sparse_column_set   | ordinal_in_order_by_list   | order_by_is_descending   | order_by_list_length   | tds_type_id   | tds_length   | tds_collation_id   | tds_collation_sort_id   |
|-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------|
| 0           | 1                | ArtistId   | 0             | 56               | int                | 4            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | NULL              | NULL            | NULL           | NULL            | 1                    | NULL                    | 0               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | 56            | 4            | NULL               | NULL                    |
| 0           | 2                | ArtistName | 0             | 231              | nvarchar(255)      | 510          | 0           | 0       | SQL_Latin1_General_CP1_CI_AS | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | NULL              | NULL            | NULL           | NULL            | 0                    | NULL                    | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | 231           | 510          | 13632521           | 52                      |
| 0           | 3                | ActiveFrom | 1             | 40               | date               | 3            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | NULL              | NULL            | NULL           | NULL            | 0                    | NULL                    | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | 40            | 3            | NULL               | NULL                    |
+-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+

Có rất nhiều cột được trả về với quy trình được lưu trữ này (xem tài liệu của Microsoft để biết giải thích về từng cột), vì vậy có thể bạn sẽ cần cuộn sang bên để xem tất cả chúng.

Tôi sẽ chuyển sang đầu ra theo chiều dọc trong một số ví dụ tiếp theo, trong trường hợp bạn gặp sự cố khi cuộn sang ngang.

Chế độ duyệt

Đối số thứ ba - @browse_information_mode - chỉ định xem các cột chính bổ sung và thông tin bảng nguồn có được trả về hay không.

Các giá trị sau được chấp nhận cho đối số này:

Giá trị Kết quả
0 Không có thông tin nào được trả lại.
1 Mỗi truy vấn được phân tích như thể nó bao gồm một FOR BROWSE tùy chọn trên truy vấn. Thao tác này sẽ trả về tên bảng cơ sở dưới dạng thông tin cột nguồn.
2 Mỗi truy vấn được phân tích như thể nó sẽ được sử dụng để chuẩn bị hoặc thực thi một con trỏ. Thao tác này sẽ trả về tên chế độ xem dưới dạng thông tin cột nguồn.

Dưới đây là các ví dụ minh họa cách mỗi giá trị này ảnh hưởng đến kết quả.

Để làm cho mọi thứ ngắn gọn hơn, tôi sẽ sửa đổi câu lệnh T-SQL của mình để chỉ trả về một cột. Tôi cũng sẽ hiển thị kết quả bằng cách sử dụng đầu ra dọc để giúp bạn không phải cuộn sang ngang.

@browse_information_mode = 0

Trong ví dụ này, tôi đặt @browse_information_mode thành 0 .

EXEC sp_describe_first_result_set 
    @tsql = N'SELECT AlbumName FROM vAlbums', 
    @params = null, 
    @browse_information_mode = 0;

Như đã đề cập trước đó, bạn có thể bỏ qua các tên tham số nếu muốn. Do đó, chúng tôi có thể sử dụng đoạn mã sau như một cách ngắn gọn hơn để làm điều tương tự.

EXEC sp_describe_first_result_set N'SELECT AlbumName FROM vAlbums', null, 0;

Kết quả (sử dụng đầu ra dọc):

is_hidden                    | 0
column_ordinal               | 1
name                         | AlbumName
is_nullable                  | 0
system_type_id               | 231
system_type_name             | nvarchar(255)
max_length                   | 510
precision                    | 0
scale                        | 0
collation_name               | SQL_Latin1_General_CP1_CI_AS
user_type_id                 | NULL
user_type_database           | NULL
user_type_schema             | NULL
user_type_name               | NULL
assembly_qualified_type_name | NULL
xml_collection_id            | NULL
xml_collection_database      | NULL
xml_collection_schema        | NULL
xml_collection_name          | NULL
is_xml_document              | 0
is_case_sensitive            | 0
is_fixed_length_clr_type     | 0
source_server                | NULL
source_database              | NULL
source_schema                | NULL
source_table                 | NULL
source_column                | NULL
is_identity_column           | 0
is_part_of_unique_key        | NULL
is_updateable                | 1
is_computed_column           | 0
is_sparse_column_set         | 0
ordinal_in_order_by_list     | NULL
order_by_is_descending       | NULL
order_by_list_length         | NULL
tds_type_id                  | 231
tds_length                   | 510
tds_collation_id             | 13632521
tds_collation_sort_id        | 52

Lưu ý rằng khá nhiều cột là NULL . Đặc biệt, hãy lưu ý rằng source_database , source_schema , source_tablesource_column các cột là NULL .

Các cột này sẽ không phải là NULL trong hai ví dụ tiếp theo, nhưng chúng sẽ tạo ra hai kết quả khác nhau.

@browse_information_mode = 1

Trong ví dụ này, tôi đặt @browse_information_mode thành 1 .

EXEC sp_describe_first_result_set 
    N'SELECT AlbumName FROM vAlbums', null, 1;

Cài đặt @browse_information_mode thành 1 trả về kết quả như thể nó bao gồm FOR BROWSE tùy chọn trên truy vấn.

Trong trường hợp của chúng tôi, điều này dẫn đến bốn hàng được trả về (đại diện cho bốn cột từ các bảng cơ sở).

Đây là bốn hàng được trả về:

+-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+
| is_hidden   | column_ordinal   | name      | is_nullable   | system_type_id   | system_type_name   | max_length   | precision   | scale   | collation_name               | user_type_id   | user_type_database   | user_type_schema   | user_type_name   | assembly_qualified_type_name   | xml_collection_id   | xml_collection_database   | xml_collection_schema   | xml_collection_name   | is_xml_document   | is_case_sensitive   | is_fixed_length_clr_type   | source_server   | source_database   | source_schema   | source_table   | source_column   | is_identity_column   | is_part_of_unique_key   | is_updateable   | is_computed_column   | is_sparse_column_set   | ordinal_in_order_by_list   | order_by_is_descending   | order_by_list_length   | tds_type_id   | tds_length   | tds_collation_id   | tds_collation_sort_id   |
|-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------|
| 0           | 1                | AlbumName | 0             | 231              | nvarchar(255)      | 510          | 0           | 0       | SQL_Latin1_General_CP1_CI_AS | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | Music             | dbo             | Albums         | AlbumName       | 0                    | 0                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | 231           | 510          | 13632521           | 52                      |
| 1           | 2                | ArtistId  | 0             | 56               | int                | 4            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | Music             | dbo             | Artists        | ArtistId        | 1                    | 1                       | 0               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | 56            | 4            | NULL               | NULL                    |
| 1           | 3                | AlbumId   | 0             | 56               | int                | 4            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | Music             | dbo             | Albums         | AlbumId         | 1                    | 1                       | 0               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | 56            | 4            | NULL               | NULL                    |
| 1           | 4                | GenreId   | 0             | 56               | int                | 4            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | Music             | dbo             | Genres         | GenreId         | 1                    | 1                       | 0               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | 56            | 4            | NULL               | NULL                    |
+-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+

Vì vậy, mặc dù tôi chỉ chỉ định một cột trong truy vấn T-SQL mà tôi đã chuyển cho thủ tục, nó trả về thông tin cho bốn cột. Đây là bốn cột được tham chiếu bởi vAlbums xem.

Hãy tập trung vào chỉ một cột bằng cách sử dụng đầu ra dọc:

is_hidden                    | 0
column_ordinal               | 1
name                         | AlbumName
is_nullable                  | 0
system_type_id               | 231
system_type_name             | nvarchar(255)
max_length                   | 510
precision                    | 0
scale                        | 0
collation_name               | SQL_Latin1_General_CP1_CI_AS
user_type_id                 | NULL
user_type_database           | NULL
user_type_schema             | NULL
user_type_name               | NULL
assembly_qualified_type_name | NULL
xml_collection_id            | NULL
xml_collection_database      | NULL
xml_collection_schema        | NULL
xml_collection_name          | NULL
is_xml_document              | 0
is_case_sensitive            | 0
is_fixed_length_clr_type     | 0
source_server                | NULL
source_database              | Music
source_schema                | dbo
source_table                 | Albums
source_column                | AlbumName
is_identity_column           | 0
is_part_of_unique_key        | 0
is_updateable                | 1
is_computed_column           | 0
is_sparse_column_set         | 0
ordinal_in_order_by_list     | NULL
order_by_is_descending       | NULL
order_by_list_length         | NULL
tds_type_id                  | 231
tds_length                   | 510
tds_collation_id             | 13632521
tds_collation_sort_id        | 52

Lưu ý rằng source_database , source_schema , source_tablesource_column cột không còn NULL . Chúng cung cấp thông tin về các đối tượng cơ sở được chế độ xem truy vấn.

Ngược lại, khi chúng tôi đặt @browse_information_mode thành 2 trong ví dụ tiếp theo, chúng tôi sẽ nhận được các cột thực tế trong chế độ xem.

Cũng lưu ý rằng source_server cột vẫn là NULL . Điều này là do máy chủ cục bộ là máy chủ gốc. Nhưng nếu chế độ xem của tôi đang truy vấn các bảng trên một máy chủ được liên kết, thì tên của máy chủ đó sẽ nằm trong source_server cột.

Xem Cách sys.dm_exec_describe_first_result_set Hoạt động để làm ví dụ. Trong bài viết đó, tôi sử dụng một chế độ xem tương tự như trong ví dụ trên, ngoại trừ việc nó truy vấn cơ sở dữ liệu trên một máy chủ được liên kết.

@browse_information_mode = 2

Cuối cùng, hãy đặt @browse_information_mode thành 2 .

EXEC sp_describe_first_result_set 
    N'SELECT AlbumName FROM vAlbums', null, 2;

Trong trường hợp này, truy vấn được phân tích như thể nó sẽ được sử dụng để chuẩn bị hoặc thực thi một con trỏ.

Lần này, chỉ có hai hàng được trả lại:

+-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+
| is_hidden   | column_ordinal   | name      | is_nullable   | system_type_id   | system_type_name   | max_length   | precision   | scale   | collation_name               | user_type_id   | user_type_database   | user_type_schema   | user_type_name   | assembly_qualified_type_name   | xml_collection_id   | xml_collection_database   | xml_collection_schema   | xml_collection_name   | is_xml_document   | is_case_sensitive   | is_fixed_length_clr_type   | source_server   | source_database   | source_schema   | source_table   | source_column   | is_identity_column   | is_part_of_unique_key   | is_updateable   | is_computed_column   | is_sparse_column_set   | ordinal_in_order_by_list   | order_by_is_descending   | order_by_list_length   | tds_type_id   | tds_length   | tds_collation_id   | tds_collation_sort_id   |
|-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------|
| 0           | 1                | AlbumName | 0             | 231              | nvarchar(255)      | 510          | 0           | 0       | SQL_Latin1_General_CP1_CI_AS | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | Music             | dbo             | vAlbums        | AlbumName       | 0                    | 0                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | 231           | 510          | 13632521           | 52                      |
| 1           | 2                | ROWSTAT^@   | 0             | 56               | int                | 4            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | NULL            | NULL              | NULL            | NULL           | NULL            | 0                    | 0                       | 0               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | 56            | 4            | NULL               | NULL                    |
+-------------+------------------+-----------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+

Và để giúp bạn không phải cuộn sang ngang, đây là hàng đầu tiên trong đầu ra theo chiều dọc:

is_hidden                    | 0
column_ordinal               | 1
name                         | AlbumName
is_nullable                  | 0
system_type_id               | 231
system_type_name             | nvarchar(255)
max_length                   | 510
precision                    | 0
scale                        | 0
collation_name               | SQL_Latin1_General_CP1_CI_AS
user_type_id                 | NULL
user_type_database           | NULL
user_type_schema             | NULL
user_type_name               | NULL
assembly_qualified_type_name | NULL
xml_collection_id            | NULL
xml_collection_database      | NULL
xml_collection_schema        | NULL
xml_collection_name          | NULL
is_xml_document              | 0
is_case_sensitive            | 0
is_fixed_length_clr_type     | 0
source_server                | NULL
source_database              | Music
source_schema                | dbo
source_table                 | vAlbums
source_column                | AlbumName
is_identity_column           | 0
is_part_of_unique_key        | 0
is_updateable                | 1
is_computed_column           | 0
is_sparse_column_set         | 0
ordinal_in_order_by_list     | NULL
order_by_is_descending       | NULL
order_by_list_length         | NULL
tds_type_id                  | 231
tds_length                   | 510
tds_collation_id             | 13632521
tds_collation_sort_id        | 52

Trong ví dụ này, source_table cột chứa tên chế độ xem thực tế, chứ không phải là bảng cơ sở.

@params Đối số

Cho đến nay, chúng tôi đã không sử dụng @params , ngoại trừ việc đặt nó thành NULL .

Nếu lô SQL mà bạn đang phân tích có chứa các tham số, hãy sử dụng @params hàm khai báo các tham số đó.

Điều này hoạt động tương tự như cách bạn khai báo các tham số khi sử dụng sp_executesql thủ tục.

Dưới đây là một ví dụ khai báo một tham số với @params đối số.

EXEC sp_describe_first_result_set 
    @tsql = N'SELECT AlbumName FROM Albums WHERE ArtistId = @ArtistId', 
    @params = N'@ArtistId int',
    @browse_information_mode = 0;

Kết quả (sử dụng đầu ra dọc):

is_hidden                    | 0
column_ordinal               | 1
name                         | AlbumName
is_nullable                  | 0
system_type_id               | 231
system_type_name             | nvarchar(255)
max_length                   | 510
precision                    | 0
scale                        | 0
collation_name               | SQL_Latin1_General_CP1_CI_AS
user_type_id                 | NULL
user_type_database           | NULL
user_type_schema             | NULL
user_type_name               | NULL
assembly_qualified_type_name | NULL
xml_collection_id            | NULL
xml_collection_database      | NULL
xml_collection_schema        | NULL
xml_collection_name          | NULL
is_xml_document              | 0
is_case_sensitive            | 0
is_fixed_length_clr_type     | 0
source_server                | NULL
source_database              | NULL
source_schema                | NULL
source_table                 | NULL
source_column                | NULL
is_identity_column           | 0
is_part_of_unique_key        | NULL
is_updateable                | 1
is_computed_column           | 0
is_sparse_column_set         | 0
ordinal_in_order_by_list     | NULL
order_by_is_descending       | NULL
order_by_list_length         | NULL
tds_type_id                  | 231
tds_length                   | 510
tds_collation_id             | 13632521
tds_collation_sort_id        | 52

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tham gia vào hàng đầu tiên

  2. Giám sát Cơ sở dữ liệu SQL qua SP_WhoIsActive hoặc FogLight | Khắc phục sự cố hiệu suất máy chủ SQL -1

  3. Làm cách nào để tách giá trị một cột thành nhiều giá trị cột?

  4. làm thế nào để lấy ngày bắt đầu và ngày kết thúc của tất cả các tuần giữa hai ngày trong máy chủ SQL?

  5. HIỂN THỊ DỮ LIỆU Tương đương trong SQL Server - sp_databases