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

Lấy các cột cơ bản của một chế độ xem dựa trên tập hợp kết quả của nó

Một trong những điều tuyệt vời về dạng xem cơ sở dữ liệu là chúng cho phép bạn chạy các truy vấn phức tạp mà không cần biết lược đồ cơ sở dữ liệu bên dưới.

Có, đúng là bạn cần biết lược đồ cơ bản khi tạo chế độ xem, nhưng bạn chỉ cần làm điều đó một lần. Sau khi tạo xong, bạn có thể truy vấn chế độ xem đó cả ngày mà không cần nhớ tất cả các tên bảng và cột, v.v.

Chế độ xem thường kết hợp dữ liệu từ nhiều bảng thành một bảng ảo, duy nhất, làm cho nó giống như một “hộp đen”. Miễn là nó hoạt động như được thiết kế, bạn không cần phải lo lắng về các chi tiết ẩn.

Nhưng nếu bạn làm muốn kiểm tra một chế độ xem cho các bảng và cột bên dưới của nó?

Trong khi sp_help hệ thống lưu trữ thủ tục sẽ cung cấp cho bạn thông tin về các cột được trả về bởi dạng xem, nó không cung cấp thông tin về các cột trong bảng cơ sở được tham chiếu trong dạng xem.

Và có, có nhiều cách để kiểm tra định nghĩa thực tế của chế độ xem. Nhưng nếu đó là một chế độ xem lớn, bạn có nguy cơ phải nhìn chéo, chỉ cố gắng chọn ra tất cả các bảng cơ sở thực tế có liên quan.

Tuy nhiên, có một phương pháp khác mà bạn có thể sử dụng để trả về các bảng và cột cơ sở được một chế độ xem sử dụng.

Bạn có thể sử dụng sys.dm_exec_describe_first_result_set chức năng quản lý động hệ thống để trả về siêu dữ liệu về tập hợp kết quả khi bạn truy vấn chế độ xem.

Cách hoạt động của nó là bạn chuyển một truy vấn T-SQL đến hàm và nó sẽ trả về siêu dữ liệu về tập kết quả. Trong trường hợp này, truy vấn mà bạn chuyển đến hàm sẽ là truy vấn mà bạn sẽ sử dụng khi truy vấn chế độ xem.

Một lợi ích của việc sử dụng phương pháp này là bạn có được bảng cơ sở và thông tin cột trong một danh sách đẹp. Mỗi cột được liệt kê trong một hàng riêng biệt.

Ngoài ra, bạn có thể thu hẹp kết quả bằng cách tinh chỉnh truy vấn của mình, có nghĩa là bạn có thể loại bỏ bất kỳ cột nào không liên quan (tức là các cột có trong chế độ xem, nhưng không liên quan đến truy vấn cụ thể của bạn).

Ví dụ

Dưới đây là một ví dụ để chứng minh cách hoạt động của nó.

SELECT 
    CONCAT(
        source_server + '.', 
        source_database + '.', 
        source_schema + '.', 
        source_table + '.', 
        source_column) AS [Source Column],
    name AS [View Column],
    user_type_name,
    system_type_name,
    max_length,
    [precision],
    scale
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT * FROM vAllCats', 
    NULL, 
    1
);

Kết quả:

+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+
| Source Column         | View Column   | user_type_name   | system_type_name   | max_length   | precision   | scale   |
|-----------------------+---------------+------------------+--------------------+--------------+-------------+---------|
| Test.dbo.Cats.CatId   | CatId         | NULL             | int                | 4            | 10          | 0       |
| Test.dbo.Cats.CatName | CatName       | NULL             | varchar(60)        | 60           | 0           | 0       |
+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+

Ở đây, tôi đã quyết định sử dụng CONCAT() chức năng nối nhiều tên cột để giúp dễ hình dung lược đồ hơn.

Trong trường hợp này, Cột Nguồn và Cột Chế độ xem ”(tức là cột được chế độ xem trả về) cả hai đều có cùng tên. Điều này sẽ xảy ra nếu chế độ xem không sử dụng bí danh cho cột.

Lưu ý rằng lý do chúng tôi có thể lấy các cột nguồn, bảng, v.v. là vì chúng tôi sử dụng 1 như đối số thứ ba. Khi chúng tôi sử dụng giá trị này, mỗi truy vấn được phân tích như thể nó có FOR BROWSE tùy chọn trên truy vấn.

Khi Chế độ xem sử dụng Bí danh cột

Nếu chế độ xem sử dụng bí danh cột khác với tên cột cơ bản thực tế, thì điều đó sẽ được phản ánh kết quả của chúng tôi.

Trong ví dụ này, chúng tôi truy vấn một chế độ xem sử dụng bí danh cột.

SELECT 
    CONCAT(
        source_server + '.', 
        source_database + '.', 
        source_schema + '.', 
        source_table + '.', 
        source_column) AS [Source Column],
    name AS [View Column],
    user_type_name,
    system_type_name,
    max_length,
    [precision],
    scale
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT * FROM vAlbums', 
    NULL, 
    1
);

Kết quả:

+------------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+
| Source Column                      | View Column   | user_type_name   | system_type_name   | max_length   | precision   | scale   |
|------------------------------------+---------------+------------------+--------------------+--------------+-------------+---------|
| Homer.Music.dbo.Artists.ArtistName | Artist        | NULL             | nvarchar(255)      | 510          | 0           | 0       |
| Homer.Music.dbo.Albums.AlbumName   | Album         | NULL             | nvarchar(255)      | 510          | 0           | 0       |
| Homer.Music.dbo.Genres.Genre       | Genre         | NULL             | nvarchar(50)       | 100          | 0           | 0       |
| Homer.Music.dbo.Artists.ArtistId   | ArtistId      | NULL             | int                | 4            | 10          | 0       |
| Homer.Music.dbo.Albums.AlbumId     | AlbumId       | NULL             | int                | 4            | 10          | 0       |
| Homer.Music.dbo.Genres.GenreId     | GenreId       | NULL             | int                | 4            | 10          | 0       |
+------------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+

Nếu chúng ta nhìn vào hai hàng đầu tiên, chúng ta có thể thấy rằng các cột bên dưới (được trả về bởi source_column ), khác với “Cột Chế độ xem” (được trả về bởi name cột).

Chúng tôi cũng có thể thấy rằng các cột nguồn cho chế độ xem này được đặt trên một máy chủ được liên kết có tên là “Homer”.

Một điều khác cần lưu ý là khi sử dụng chế độ duyệt như chúng tôi đang ở đây (tức là với 1 là đối số thứ ba), chúng tôi cũng nhận được các cột khác có liên quan đến việc hoàn thành truy vấn (ArtistId , AlbumIdGenreId ), mặc dù chúng không thực sự được trả về trong tập kết quả.

Tinh chỉnh truy vấn

Một trong những điều khác biệt sys.dm_exec_describe_first_result_set từ các thủ tục như sp_helpsp_helptext , là nó mô tả tập kết quả không phải chế độ xem.

Kết quả bạn nhận được sẽ phụ thuộc vào truy vấn thực tế bạn vượt qua, không chỉ là lượt xem.

Đây là truy vấn tương tự như trong ví dụ trước, ngoại trừ lần này tôi chỉ chọn một cột từ chế độ xem (thay vì sử dụng * ký tự đại diện để chọn tất cả các cột).

SELECT 
    CONCAT(
        source_server + '.', 
        source_database + '.', 
        source_schema + '.', 
        source_table + '.', 
        source_column) AS [Source Column],
    name AS [View Column],
    user_type_name,
    system_type_name,
    max_length,
    [precision],
    scale
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT Album FROM vAlbums', 
    NULL, 
    1
);

Kết quả:

+----------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+
| Source Column                    | View Column   | user_type_name   | system_type_name   | max_length   | precision   | scale   |
|----------------------------------+---------------+------------------+--------------------+--------------+-------------+---------|
| Homer.Music.dbo.Albums.AlbumName | Album         | NULL             | nvarchar(255)      | 510          | 0           | 0       |
| Homer.Music.dbo.Artists.ArtistId | ArtistId      | NULL             | int                | 4            | 10          | 0       |
| Homer.Music.dbo.Albums.AlbumId   | AlbumId       | NULL             | int                | 4            | 10          | 0       |
| Homer.Music.dbo.Genres.GenreId   | GenreId       | NULL             | int                | 4            | 10          | 0       |
+----------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+

Vì vậy, lần này, chỉ trả về bốn hàng thay vì sáu hàng.

Lấy các cột cơ bản từ nhiều chế độ xem

Như đã đề cập, sys.dm_exec_describe_first_result_set hàm mô tả toàn bộ tập kết quả, không chỉ một chế độ xem đơn lẻ hoặc đối tượng khác.

Do đó, bạn có thể khám phá các cột bên dưới từ nhiều chế độ xem và đối tượng cùng một lúc.

Ví dụ:

SELECT 
    CONCAT(
        source_server + '.', 
        source_database + '.', 
        source_schema + '.', 
        source_table + '.', 
        source_column) AS [Source Column],
    name AS [View Column],
    user_type_name,
    system_type_name,
    max_length,
    [precision],
    scale
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT * FROM vAllCats c INNER JOIN vAllDogs d ON c.CatName = d.DogName', 
    NULL, 
    1
);

Kết quả:

+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+
| Source Column         | View Column   | user_type_name   | system_type_name   | max_length   | precision   | scale   |
|-----------------------+---------------+------------------+--------------------+--------------+-------------+---------|
| Test.dbo.Cats.CatId   | CatId         | NULL             | int                | 4            | 10          | 0       |
| Test.dbo.Cats.CatName | CatName       | NULL             | varchar(60)        | 60           | 0           | 0       |
| Test.dbo.Dogs.DogId   | DogId         | NULL             | int                | 4            | 10          | 0       |
| Test.dbo.Dogs.DogName | DogName       | NULL             | nvarchar(255)      | 510          | 0           | 0       |
| Test.dbo.Dogs.GoodDog | GoodDog       | NULL             | bit                | 1            | 1           | 0       |
+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giải pháp cho:Cập nhật cửa hàng, chèn hoặc xóa câu lệnh ảnh hưởng đến một số hàng không mong muốn (0)

  2. Java JDBC:ngày nghỉ hai ngày liên tục

  3. Mệnh đề VALUES trong SQL Server

  4. SQL Server’s Tương đương với Sleep ():Câu lệnh WAITFOR

  5. Thu thập dữ liệu tự động:Tệp cơ sở dữ liệu và ổ đĩa logic trong MS SQL Server