Salah satu hal tentang sys.dm_sql_referenced_entities()
fungsi manajemen dinamis sistem adalah bahwa Anda dapat menggunakannya pada entitas lintas-database dan lintas-server.
Ini berarti Anda dapat menemukan entitas yang direferensikan yang berada di database yang berbeda dan bahkan di server yang berbeda.
Artikel ini memberikan contoh sys.dm_sql_referenced_entities()
mengembalikan prosedur tersimpan yang menanyakan database di server tertaut.
Contoh 1 – Prosedur Tersimpan
Pertama, mari buat prosedur tersimpan yang mengembalikan data dari server tertaut:
CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [Homer].[Music].[dbo].[Albums] WHERE ArtistId = @ArtistId;
Kita dapat melihat bahwa prosedur tersimpan menggunakan nama empat bagian untuk referensi tabel database. Ini karena database berada di server berbeda yang telah dikonfigurasi sebagai server tertaut dari server tempat prosedur tersimpan.
Dengan kata lain, prosedur tersimpan ini mengembalikan data dari server tertaut.
Dalam contoh ini, Homer
adalah server tertaut, dan Music
adalah databasenya.
Contoh 2 – Jalankan sys.dm_sql_referenced_entities() Terhadap Stored Procedure
Sekarang mari kita gunakan sys.dm_sql_referenced_entities()
untuk mengembalikan entitas yang dirujuk dalam prosedur tersimpan.
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');
Hasil:
+----------+------------+----------+----------+---------+------------------+ | Server | Database | Schema | Entity | Minor | Class | |----------+------------+----------+----------+---------+------------------| | Homer | Music | dbo | Albums | NULL | OBJECT_OR_COLUMN | +----------+------------+----------+----------+---------+------------------+
Jadi berhasil mengembalikan tabel yang direferensikan (walaupun bukan kolom/nama minor). Itu juga termasuk nama server ( Homer ) dan nama database ( Musik ).
Perhatikan bahwa saya tidak mengembalikan semua kolom dalam contoh ini demi singkatnya.
Contoh 3 – Menjalankan sys.dm_sql_referenced_entities() PADA Server Tertaut
Apakah hasil tersebut terlihat berbeda dengan apa yang kami dapatkan jika prosedur tersimpan berada di server tertaut (jarak jauh) yang sebenarnya?
Mari kita coba.
Di sini, saya melompat ke server lain dan menjalankan kode berikut:
CREATE PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [dbo].[Albums] WHERE ArtistId = @ArtistId;
Perhatikan bahwa saya tidak perlu menggunakan empat bagian penamaan, mengingat ini membuat kueri tabel di server yang sama.
Sekarang jalankan sys.dm_sql_referenced_entities()
di server tertaut:
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');
Hasil:
+----------+------------+----------+----------+-----------+------------------+ | 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 | +----------+------------+----------+----------+-----------+------------------+
Dalam hal ini, kolom disertakan dalam hasil.
Perhatikan juga bahwa kolom Server dan Database adalah NULL untuk semua baris. Ini karena keduanya tidak termasuk dalam definisi prosedur tersimpan. Jika saya mengubah definisi prosedur tersimpan untuk memasukkan server dan database, saya akan melihatnya di sini. Namun, server hanya muncul di baris pertama.
ALTER PROCEDURE [dbo].[uspGetAlbumsByArtist] @ArtistId int AS SELECT AlbumName FROM [SQLServer007].[Music].[dbo].[Albums] WHERE ArtistId = @ArtistId;
Hasil:
+--------------+------------+----------+----------+-----------+------------------+ | 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 | +--------------+------------+----------+----------+-----------+------------------+
Dalam hal ini, nama servernya adalah SQLServer007, jadi saya harus menggunakannya sebagai ganti Homer (nama yang saya berikan saat membuat server tertaut dari server lain).
Kita juga dapat menggunakan OPENQUERY()
jika kita ingin melompat kembali ke server lokal dan menjalankannya pada server yang ditautkan:
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'');' );
Hasil:
+--------------+------------+----------+----------+-----------+------------------+ | 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 | +--------------+------------+----------+----------+-----------+------------------+
Perhatikan bahwa dalam hal ini saya harus menghindari semua karakter kutipan tunggal.
Juga, jika saya mencoba menjalankan fungsi melalui kueri terdistribusi (tanpa menggunakan OPENQUERY()
), saya mendapatkan pesan kesalahan 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');
Hasil:
Msg 4122, Level 16, State 1, Line 10 Remote table-valued function calls are not allowed.