Một trong những điều về sys.dm_sql_referenced_entities()
chức năng quản lý động hệ thống là bạn có thể sử dụng nó trên các thực thể cơ sở dữ liệu chéo và máy chủ chéo.
Điều này có nghĩa là bạn có thể tìm thấy các thực thể được tham chiếu trong một cơ sở dữ liệu khác và thậm chí trên một máy chủ khác.
Bài viết này cung cấp một ví dụ về sys.dm_sql_referenced_entities()
trả về một thủ tục được lưu trữ truy vấn cơ sở dữ liệu trên máy chủ được liên kết.
Ví dụ 1 - Thủ tục được Lưu trữ
Trước tiên, hãy tạo một quy trình được lưu trữ trả về dữ liệu từ một máy chủ được liên kết:
CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [Homer].[Music].[dbo].[Albums] WHERE ArtistId = @ArtistId;
Chúng ta có thể thấy rằng thủ tục được lưu trữ sử dụng tên gồm bốn phần để tham chiếu bảng cơ sở dữ liệu. Điều này là do cơ sở dữ liệu nằm trên một máy chủ khác đã được định cấu hình như một máy chủ được liên kết từ máy chủ mà quy trình được lưu trữ được đặt.
Nói cách khác, thủ tục được lưu trữ này trả về dữ liệu từ một máy chủ được liên kết.
Trong ví dụ này, Homer
là máy chủ được liên kết và Music
là cơ sở dữ liệu.
Ví dụ 2 - Chạy sys.dm_sql_referenced_entities () theo quy trình đã lưu trữ
Bây giờ, hãy sử dụng sys.dm_sql_referenced_entities()
để trả về các thực thể được tham chiếu trong thủ tục được lưu trữ.
SELECT referenced_server_name AS [Server], referenced_database_name AS [Database], referenced_schema_name AS [Schema], referenced_entity_name AS [Entity], referenced_minor_name AS [Minor], referenced_class_desc AS [Class] FROM sys.dm_sql_referenced_entities ( 'dbo.uspGetAlbumsByArtist', 'OBJECT');
Kết quả:
+----------+------------+----------+----------+---------+------------------+ | Server | Database | Schema | Entity | Minor | Class | |----------+------------+----------+----------+---------+------------------| | Homer | Music | dbo | Albums | NULL | OBJECT_OR_COLUMN | +----------+------------+----------+----------+---------+------------------+
Vì vậy, nó đã trả về thành công bảng đang được tham chiếu (mặc dù không phải là tên cột / tên nhỏ). Nó cũng bao gồm tên máy chủ ( Homer ) và tên cơ sở dữ liệu ( Music ).
Lưu ý rằng tôi không trả lại tất cả các cột trong ví dụ này vì mục đích ngắn gọn.
Ví dụ 3 - Chạy sys.dm_sql_referenced_entities () TRÊN máy chủ được liên kết
Những kết quả đó có khác gì so với những gì chúng tôi nhận được nếu quy trình được lưu trữ trên máy chủ được liên kết thực tế (từ xa) không?
Hãy thử nó.
Tại đây, tôi chuyển sang máy chủ khác và chạy đoạn mã sau:
CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId;
Lưu ý rằng tôi không cần sử dụng cách đặt tên bốn phần, vì nó đang truy vấn các bảng trên cùng một máy chủ.
Bây giờ hãy chạy sys.dm_sql_referenced_entities()
trên máy chủ được liên kết:
SELECT referenced_server_name AS [Server], referenced_database_name AS [Database], referenced_schema_name AS [Schema], referenced_entity_name AS [Entity], referenced_minor_name AS [Minor], referenced_class_desc AS [Class] FROM sys.dm_sql_referenced_entities ( '[dbo].uspGetAlbumsByArtist', 'OBJECT');
Kết quả:
+----------+------------+----------+----------+-----------+------------------+ | Server | Database | Schema | Entity | Minor | Class | |----------+------------+----------+----------+-----------+------------------| | NULL | NULL | dbo | Albums | NULL | OBJECT_OR_COLUMN | | NULL | NULL | dbo | Albums | AlbumName | OBJECT_OR_COLUMN | | NULL | NULL | dbo | Albums | ArtistId | OBJECT_OR_COLUMN | +----------+------------+----------+----------+-----------+------------------+
Trong trường hợp này, các cột được bao gồm trong kết quả.
Cũng lưu ý rằng cột Máy chủ và Cơ sở dữ liệu là NULL cho tất cả các hàng. Điều này là do cả hai đều không có trong định nghĩa của thủ tục được lưu trữ. Nếu tôi thay đổi định nghĩa của thủ tục được lưu trữ để bao gồm máy chủ và cơ sở dữ liệu, tôi sẽ thấy chúng ở đây. Tuy nhiên, máy chủ chỉ xuất hiện ở hàng đầu tiên.
ALTER PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [SQLServer007].[Music].[dbo].[Albums] WHERE ArtistId = @ArtistId;
Kết quả:
+--------------+------------+----------+----------+-----------+------------------+ | Server | Database | Schema | Entity | Minor | Class | |--------------+------------+----------+----------+-----------+------------------| | SQLServer007 | Music | dbo | Albums | NULL | OBJECT_OR_COLUMN | | NULL | Music | dbo | Albums | AlbumName | OBJECT_OR_COLUMN | | NULL | Music | dbo | Albums | ArtistId | OBJECT_OR_COLUMN | +--------------+------------+----------+----------+-----------+------------------+
Trong trường hợp này, tên của máy chủ là SQLServer007, vì vậy tôi phải sử dụng tên đó thay vì Homer (là tên tôi đã đặt khi tạo máy chủ được liên kết từ máy chủ khác).
Chúng tôi cũng có thể sử dụng OPENQUERY()
nếu chúng tôi muốn quay lại máy chủ cục bộ và chạy nó trên máy chủ được liên kết:
SELECT * FROM OPENQUERY( Homer, 'SELECT referenced_server_name AS [Server], referenced_database_name AS [Database], referenced_schema_name AS [Schema], referenced_entity_name AS [Entity], referenced_minor_name AS [Minor], referenced_class_desc AS [Class] FROM sys.dm_sql_referenced_entities ( ''[dbo].uspGetAlbumsByArtist'', ''OBJECT'');' );
Kết quả:
+--------------+------------+----------+----------+-----------+------------------+ | Server | Database | Schema | Entity | Minor | Class | |--------------+------------+----------+----------+-----------+------------------| | SQLServer007 | Music | dbo | Albums | NULL | OBJECT_OR_COLUMN | | NULL | Music | dbo | Albums | AlbumName | OBJECT_OR_COLUMN | | NULL | Music | dbo | Albums | ArtistId | OBJECT_OR_COLUMN | +--------------+------------+----------+----------+-----------+------------------+
Lưu ý rằng trong trường hợp này, tôi phải thoát khỏi tất cả các ký tự trích dẫn duy nhất.
Ngoài ra, nếu tôi cố gắng chạy hàm thông qua truy vấn phân tán (mà không sử dụng OPENQUERY()
), Tôi nhận được thông báo lỗi 4122:
SELECT referenced_server_name AS [Server], referenced_database_name AS [Database], referenced_schema_name AS [Schema], referenced_entity_name AS [Entity], referenced_minor_name AS [Minor], referenced_class_desc AS [Class] FROM [Homer].[Music].[sys].dm_sql_referenced_entities ( '[dbo].[uspGetAlbumsByArtist]', 'OBJECT');
Kết quả:
Msg 4122, Level 16, State 1, Line 10 Remote table-valued function calls are not allowed.