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

3 cách để lấy giản đồ của một tập hợp kết quả trong SQL Server

Đôi khi, khi bạn chạy một truy vấn trong SQL Server, bạn có thể muốn biết kiểu dữ liệu cơ bản của mỗi cột là gì, độ chính xác, độ dài của nó, có nullable hay không, v.v.

Nếu bạn chỉ đang truy vấn một bảng, bạn có thể lấy loại dữ liệu này bằng các thủ tục như sp_columns . Nhưng nếu truy vấn của bạn chạy trên nhiều bảng, điều này có thể rất khó sử dụng nhanh chóng.

May mắn thay, bạn có thể thực hiện một số cách để lấy siêu dữ liệu như vậy cho tập hợp kết quả trong SQL Server.

sp_describe_first_result_set Quy trình lưu trữ hệ thống

sp_describe_first_result_set hệ thống lưu trữ thủ tục được thiết kế đặc biệt để trả về siêu dữ liệu cho một tập hợp kết quả.

Nó chấp nhận ba tham số, nhưng hai tham số cuối cùng là tùy chọn. Tham số đầu tiên là truy vấn T-SQL mà bạn muốn phân tích.

Dưới đây là một ví dụ về quy trình này đang hoạt động.

DECLARE @tsql_query nvarchar(max);
SET @tsql_query = 'SELECT
    ar.ArtistName,
    al.AlbumName,
    g.Genre
FROM 
    Artists ar 
    INNER JOIN Albums al 
    ON ar.ArtistId = al.ArtistId 
    INNER JOIN Homer.Music.dbo.Genres g 
    ON al.GenreId = g.GenreId';

EXEC sp_describe_first_result_set @tsql_query, null, 1;

Bạn thực sự có thể cung cấp truy vấn dưới dạng một chuỗi ký tự, nhưng trong trường hợp này, tôi đã đặt nó trong một biến có tên là @tsql_query .

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                | 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            | Music             | dbo             | Artists        | ArtistName      | 0                    | 0                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | 231           | 510          | 13632521           | 52                      |
| 0           | 2                | 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                      |
| 0           | 3                | Genre      | 0             | 231              | nvarchar(50)       | 100          | 0           | 0       | SQL_Latin1_General_CP1_CI_AS | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | Homer           | Music             | dbo             | Genres         | Genre           | 0                    | 0                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | 231           | 100          | 13632521           | 52                      |
| 1           | 4                | 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           | 5                | 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           | 6                | GenreId    | 0             | 56               | int                | 4            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | Homer           | Music             | dbo             | Genres         | GenreId         | 0                    | 1                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | 56            | 4            | NULL               | NULL                    |
+-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+---------------+--------------+--------------------+-------------------------+

Như bạn có thể thấy, thủ tục được lưu trữ này trả về rất nhiều cột.

Nếu bạn xem xét kỹ truy vấn mà tôi đang phân tích, bạn sẽ nhận thấy rằng một trong các bảng được tham chiếu nằm trên một máy chủ được liên kết có tên là “Homer”. Trong kết quả do sp_describe_first_result_set , giá trị trong source_server cột phản ánh máy chủ được liên kết này cho cột cơ bản đó.

Trong ví dụ này, tôi đã sử dụng 1 như đối số thứ ba. Bạn cũng có thể sử dụng 0 hoặc 2 . Xem Cách thực hiện sp_describe_first_result_set Hoạt động để giải thích và ví dụ về cách cài đặt này ảnh hưởng đến kết quả.

sys.dm_exec_describe_first_result_set Chế độ xem hệ thống

sys.dm_exec_describe_first_result_set chế độ xem hệ thống sử dụng cùng một thuật toán với sp_describe_first_result_set và nó trả về cùng một thông tin.

Vì vậy, chúng tôi có thể sửa đổi ví dụ trước của mình để sử dụng sys.dm_exec_describe_first_result_set thay vì sp_describe_first_result_set .

DECLARE @tsql_query nvarchar(max);
SET @tsql_query = 'SELECT
    ar.ArtistName,
    al.AlbumName,
    g.Genre
FROM 
    Artists ar 
    INNER JOIN Albums al 
    ON ar.ArtistId = al.ArtistId 
    INNER JOIN Homer.Music.dbo.Genres g 
    ON al.GenreId = g.GenreId';
SELECT * 
FROM sys.dm_exec_describe_first_result_set(
    @tsql_query, 
    null, 
    1
    );

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   | error_number   | error_severity   | error_state   | error_message   | error_type   | error_type_desc   |
|-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------|
| 0           | 1                | 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            | Music             | dbo             | Artists        | ArtistName      | 0                    | 0                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
| 0           | 2                | 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                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
| 0           | 3                | Genre      | 0             | 231              | nvarchar(50)       | 100          | 0           | 0       | SQL_Latin1_General_CP1_CI_AS | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | Homer           | Music             | dbo             | Genres         | Genre           | 0                    | 0                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
| 1           | 4                | 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                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
| 1           | 5                | 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                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
| 1           | 6                | GenreId    | 0             | 56               | int                | 4            | 10          | 0       | NULL                         | NULL           | NULL                 | NULL               | NULL             | NULL                           | NULL                | NULL                      | NULL                    | NULL                  | 0                 | 0                   | 0                          | Homer           | Music             | dbo             | Genres         | GenreId         | 0                    | 1                       | 1               | 0                    | 0                      | NULL                       | NULL                     | NULL                   | NULL           | NULL             | NULL          | NULL            | NULL         | NULL              |
+-------------+------------------+------------+---------------+------------------+--------------------+--------------+-------------+---------+------------------------------+----------------+----------------------+--------------------+------------------+--------------------------------+---------------------+---------------------------+-------------------------+-----------------------+-------------------+---------------------+----------------------------+-----------------+-------------------+-----------------+----------------+-----------------+----------------------+-------------------------+-----------------+----------------------+------------------------+----------------------------+--------------------------+------------------------+----------------+------------------+---------------+-----------------+--------------+-------------------+

Như với sp_describe_first_result_set , bạn có thể thay đổi đối số thứ hai và thứ ba. Xem Cách hoạt động của sys.dm_exec_describe_first_result_set.

Sử dụng OPENROWSET

Nếu bạn nhìn vào mã nguồn của sys.dm_exec_describe_first_result_set , bạn sẽ thấy rằng nó sử dụng OPENROWSET để đạt được kết quả của nó.

Tương tự, chúng ta có thể sử dụng OPENROWSET để làm một điều tương tự. Ví dụ:chúng tôi có thể sử dụng OPENROWSET để chạy không kết quả hàng đầu của truy vấn vào một bảng tạm thời, sau đó sử dụng sp_columns thủ tục trả về thông tin cột về bảng tạm thời đó (phản ánh tập hợp kết quả của truy vấn của chúng tôi).

SELECT TOP 0 * INTO #TempTable 
FROM OPENROWSET(
    'SQLNCLI', 
    'Server=localhost;Trusted_Connection=yes;', 
    'SELECT
    ar.ArtistName,
    al.AlbumName,
    g.Genre
FROM 
    Music.dbo.Artists ar 
    INNER JOIN Music.dbo.Albums al 
    ON ar.ArtistId = al.ArtistId 
    INNER JOIN Music.dbo.Genres g 
    ON al.GenreId = g.GenreId');
EXEC('USE tempdb EXEC sp_columns #TempTable DROP TABLE #TempTable');

Kết quả:

+-------------------+---------------+----------------------------------------------------------------------------------------------------------------------------------+---------------+-------------+-------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+
| TABLE_QUALIFIER   | TABLE_OWNER   | TABLE_NAME                                                                                                                       | COLUMN_NAME   | DATA_TYPE   | TYPE_NAME   | PRECISION   | LENGTH   | SCALE   | RADIX   | NULLABLE   | REMARKS   | COLUMN_DEF   | SQL_DATA_TYPE   | SQL_DATETIME_SUB   | CHAR_OCTET_LENGTH   | ORDINAL_POSITION   | IS_NULLABLE   | SS_DATA_TYPE   |
|-------------------+---------------+----------------------------------------------------------------------------------------------------------------------------------+---------------+-------------+-------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------|
| tempdb            | dbo           | #TempTable__________________________________________________________________________________________________________00000000000C | ArtistName    | -9          | nvarchar    | 255         | 510      | NULL    | NULL    | 0          | NULL      | NULL         | -9              | NULL               | 510                 | 1                  | NO            | 39             |
| tempdb            | dbo           | #TempTable__________________________________________________________________________________________________________00000000000C | AlbumName     | -9          | nvarchar    | 255         | 510      | NULL    | NULL    | 0          | NULL      | NULL         | -9              | NULL               | 510                 | 2                  | NO            | 39             |
| tempdb            | dbo           | #TempTable__________________________________________________________________________________________________________00000000000C | Genre         | -9          | nvarchar    | 50          | 100      | NULL    | NULL    | 0          | NULL      | NULL         | -9              | NULL               | 100                 | 3                  | NO            | 39             |
+-------------------+---------------+----------------------------------------------------------------------------------------------------------------------------------+---------------+-------------+-------------+-------------+----------+---------+---------+------------+-----------+--------------+-----------------+--------------------+---------------------+--------------------+---------------+----------------+

Bạn có thể thay thế sp_columns với sp_help nếu được ưu tiên.

Tôi nghĩ rằng hai phương pháp đầu tiên tốt hơn, nhưng ít nhất đó là một tùy chọn khác (đặc biệt nếu bạn đang sử dụng phiên bản SQL Server cũ hơn không hỗ trợ sys.dm_exec_describe_first_result_set hoặc sp_describe_first_result_set .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi các hàng và cột mà không có tổng hợp

  2. Chuyển phân vùng bảng trong SQL Server:Hướng dẫn

  3. ISJSON () Ví dụ trong SQL Server (T-SQL)

  4. Cách chọn một số ký tự nhất định từ bên trái hoặc bên phải của chuỗi trong SQL Server

  5. Có thể chọn dữ liệu máy chủ sql bằng cách sử dụng vị trí thứ tự cột không