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

Tìm phụ thuộc trong SQL Server:sql_expression_dependencies

Trong SQL Server, bạn có thể sử dụng sys.sql_expression_dependencies chế độ xem danh mục hệ thống để trả về tất cả các phụ thuộc vào một thực thể do người dùng xác định trong cơ sở dữ liệu hiện tại. Điều này bao gồm sự phụ thuộc giữa các hàm vô hướng, được biên dịch nguyên bản do người dùng xác định và các mô-đun SQL Server khác.

Bạn có thể sử dụng chế độ xem này để:

  • Trả lại các thực thể phụ thuộc vào một thực thể nhất định
  • Trả lại các thực thể mà một thực thể nhất định phụ thuộc vào

Vì vậy, ví dụ, bạn có thể sử dụng nó để trả về tất cả các đối tượng tham chiếu đến một bảng cụ thể. Bạn cũng có thể sử dụng nó để trả về tất cả các đối tượng mà một thủ tục được lưu trữ cụ thể tham chiếu trong mã của nó.

Cụ thể, sys.sql_expression_dependencies xem thông tin phụ thuộc báo cáo cho các thực thể sau:

  • Các thực thể liên kết với giản đồ.
  • Các thực thể không bị ràng buộc bởi giản đồ.
  • Các thực thể trên nhiều cơ sở dữ liệu và nhiều máy chủ. Tên thực thể được báo cáo; tuy nhiên, ID thực thể không được giải quyết.
  • Phụ thuộc mức cột vào các thực thể liên kết với lược đồ. Bạn có thể trả lại sự phụ thuộc cấp độ cột cho các đối tượng không bị ràng buộc bởi giản đồ bằng cách sử dụng sys.dm_sql_referenced_entities.
  • DDL cấp máy chủ kích hoạt khi ở trong ngữ cảnh của cơ sở dữ liệu chính.

Ví dụ 1 - Tất cả các cột được trả về

Dưới đây là một ví dụ nhanh chọn tất cả các cột từ sys.sql_expression_dependencies . Điều này cho chúng tôi biết dữ liệu nào thực sự được trả về trong chế độ xem và chúng tôi có thể sử dụng bất kỳ cột nào trong số các cột này trong các truy vấn của mình để chỉ trả lại dữ liệu mà chúng tôi quan tâm.

SELECT TOP(1) * 
FROM sys.sql_expression_dependencies;

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

referencing_id            | 114099447
referencing_minor_id      | 0
referencing_class         | 1
referencing_class_desc    | OBJECT_OR_COLUMN
is_schema_bound_reference | 0
referenced_class          | 1
referenced_class_desc     | OBJECT_OR_COLUMN
referenced_server_name    | NULL
referenced_database_name  | NULL
referenced_schema_name    | dbo
referenced_entity_name    | Client
referenced_id             | 434100587
referenced_minor_id       | 0
is_caller_dependent       | 0
is_ambiguous              | 0

Ví dụ này sử dụng đầu ra theo chiều dọc để giúp dễ dàng nhìn thấy tên cột hơn mà không cần phải cuộn theo chiều ngang. Do đó, tên cột được liệt kê ở bên trái và giá trị tương ứng của chúng ở bên phải.

Ngoài ra, để ngắn gọn, tôi đã sử dụng TOP(1) để giới hạn kết quả chỉ ở hàng đầu tiên.

Ví dụ 2 - Tìm đối tượng phụ thuộc vào một đối tượng

Để tìm các đối tượng phụ thuộc vào một thực thể nhất định, hãy sử dụng referencing_id của thực thể đó khi chọn từ chế độ xem.

Ví dụ:

SELECT
    referenced_server_name AS [Referenced Server],
    referenced_database_name AS [Referenced DB],
    referenced_schema_name AS [Referenced Schema],
    referenced_entity_name AS [Referenced Entity],
    referenced_class_desc AS [Referenced Entity Class] 
FROM sys.sql_expression_dependencies
WHERE referencing_id = OBJECT_ID('uspGetClient');

Kết quả:

+---------------------+-----------------+---------------------+---------------------+---------------------------+
| Referenced Server   | Referenced DB   | Referenced Schema   | Referenced Entity   | Referenced Entity Class   |
|---------------------+-----------------+---------------------+---------------------+---------------------------|
| NULL                | NULL            | dbo                 | Client              | OBJECT_OR_COLUMN          |
| NULL                | NULL            | NULL                | clientcode          | TYPE                      |
+---------------------+-----------------+---------------------+---------------------+---------------------------+

Ở đây tôi nhận được tất cả các thực thể được tham chiếu trong uspGetClient thủ tục được lưu trữ.

Đây là định nghĩa thực tế cho uspGetClient :

CREATE PROCEDURE [dbo].[uspGetClient] @ClientCode clientcode AS
SELECT 
    FirstName,
    LastName
FROM [dbo].[Client]
WHERE ClientCode = @ClientCode;

Vì vậy, chúng ta có thể thấy rằng nó chọn dữ liệu từ một bảng có tên là Client và nó chấp nhận một đối số có tên là @ClientCode với kiểu dữ liệu (bí danh do người dùng xác định) là clientcode .

Ví dụ 3 - Tìm Đối tượng mà Đối tượng phụ thuộc vào

Bạn cũng có thể chuyển đổi nó và lấy các đối tượng mà một thực thể nhất định phụ thuộc vào. Để làm điều đó, hãy sử dụng referencing_id (thay vì referencing_id ) khi chọn từ chế độ xem.

Ví dụ:

SELECT
    OBJECT_NAME(referencing_id) AS [Referencing Entity],
    OBJECT_NAME(referencing_minor_id) AS [Referencing Minor Entity],
    referencing_class_desc AS [Class],
    COL_NAME(referenced_id, referenced_minor_id) AS [Column]
FROM sys.sql_expression_dependencies
WHERE referenced_id = OBJECT_ID('Client');

Kết quả:

+----------------------+----------------------------+------------------+------------+
| Referencing Entity   | Referencing Minor Entity   | Class            | Column     |
|----------------------+----------------------------+------------------+------------|
| uspGetClient         | NULL                       | OBJECT_OR_COLUMN | NULL       |
| uspGetOrdersByClient | NULL                       | OBJECT_OR_COLUMN | NULL       |
| chkClientCode        | NULL                       | OBJECT_OR_COLUMN | ClientCode |
+----------------------+----------------------------+------------------+------------+

Trong ví dụ này, tôi muốn xem thực thể nào phụ thuộc vào Client bảng (tức là thực thể nào tham chiếu bảng đó trong mã SQL của chúng).

Bạn sẽ nhận thấy rằng tôi cũng đã chọn các cột khác nhau. Điều này là do tôi đang tìm kiếm thông tin về tài liệu tham khảo thực thể, không phải được tham chiếu thực thể như trong ví dụ trước.

Ví dụ 4 - Lấy thêm thông tin

Bạn có thể nối chế độ xem này với các chế độ xem và / hoặc bảng khác để trả lại thêm thông tin.

Ví dụ:bạn có thể kết hợp nó với sys.objects để lấy kiểu của đối tượng tham chiếu:

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],   
    o.type_desc AS [Type],   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
    referenced_entity_name AS [Referenced Entity],   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referenced_id = OBJECT_ID(N'Client');

Kết quả:

+----------------------+----------------------+----------+---------------------+------------+
| Referencing Entity   | Type                 | Column   | Referenced Entity   | Column     |
|----------------------+----------------------+----------+---------------------+------------|
| uspGetClient         | SQL_STORED_PROCEDURE | (n/a)    | Client              | (n/a)      |
| uspGetOrdersByClient | SQL_STORED_PROCEDURE | (n/a)    | Client              | (n/a)      |
| chkClientCode        | CHECK_CONSTRAINT     | (n/a)    | Client              | ClientCode |
+----------------------+----------------------+----------+---------------------+------------+

Trong ví dụ này, tôi cũng đã thêm COALESCE() hàm trả về (n/a) bất cứ khi nào referencing_minor_idNULL . Hàm này là một trong những cách bạn có thể thay thế giá trị NULL bằng một chuỗi trong SQL Server.

Ví dụ 5 - Cơ sở dữ liệu chéo &các thực thể trên nhiều máy chủ

Như đã đề cập, sql_expression_dependencies cũng hoạt động trên các thực thể cơ sở dữ liệu chéo và máy chủ chéo. Tuy nhiên, trong trường hợp này, tên tổ chức được báo cáo nhưng ID tổ chức không được giải quyết.

Ví dụ này sử dụng chính xác mã giống như với Ví dụ 2, ngoại trừ lần này là mã cho một thực thể khác. Lần này, tôi muốn tìm các thực thể phụ thuộc vào uspGetAlbumsByArtist :

SELECT
    referenced_server_name AS [Referenced Server],
    referenced_database_name AS [Referenced DB],
    referenced_schema_name AS [Referenced Schema],
    referenced_entity_name AS [Referenced Entity],
    referenced_class_desc AS [Referenced Entity Class] 
FROM sys.sql_expression_dependencies
WHERE referencing_id = OBJECT_ID('uspGetAlbumsByArtist');

Kết quả:

+---------------------+-----------------+---------------------+---------------------+---------------------------+
| Referenced Server   | Referenced DB   | Referenced Schema   | Referenced Entity   | Referenced Entity Class   |
|---------------------+-----------------+---------------------+---------------------+---------------------------|
| Homer               | Music           | dbo                 | Albums              | OBJECT_OR_COLUMN          |
+---------------------+-----------------+---------------------+---------------------+---------------------------+

Trong ví dụ này, máy chủ được tham chiếu và cơ sở dữ liệu được tham chiếu có một giá trị (thay vì là NULL như trong ví dụ trước đó). Đó là vì uspGetAlbumsByArtist thủ tục được lưu trữ sử dụng tên bốn phần để tham chiếu đến thực thể trên máy chủ được liên kết (thủ tục được lưu trữ từ ví dụ trước đó không sử dụng tên bốn phần và nó cũng không sử dụng tên ba phần để chỉ định DB) .

Trong ví dụ này, Homer là tên của máy chủ được liên kết và Music là cơ sở dữ liệu mà thủ tục được lưu trữ truy vấn.

Chúng ta có thể thấy điều này trong uspGetAlbumsByArtist Định nghĩa của ‘s:

CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS
SELECT AlbumName
FROM [Homer].[Music].[dbo].[Albums]
WHERE ArtistId = @ArtistId;

Tài liệu chính thức

Để biết thêm thông tin chi tiết và ví dụ, hãy xem sys.sql_expression_dependencies trên trang web của Microsoft.

Đây là một bài viết khác của Microsoft bao gồm các hướng dẫn để nhận các phần phụ thuộc qua SSMS.


  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ác cách có thể để khắc phục sự cố lỗi siêu dữ liệu máy chủ SQL

  2. Cách xác định giá trị trường không thể chuyển đổi thành (thập phân, float, int) trong SQL Server

  3. SQL chọn tất cả nếu tham số là null nếu không trả về mục cụ thể

  4. Tại sao tôi không thể sử dụng bí danh trong cột đếm (*) và tham chiếu nó trong mệnh đề có?

  5. lỗi khi chèn vào bảng có thay vì kích hoạt từ khung dữ liệu thực thể