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_id
là NULL
. 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.