Jika Anda perlu menggunakan OBJECT_NAME()
fungsi untuk mendapatkan nama objek dari database yang berbeda di SQL Server, Anda mungkin mengalami masalah jika tidak tahu cara kerjanya.
Anda mungkin tahu bahwa OBJECT_NAME()
menerima object_id
argumen yang memberi tahu SQL Server objek mana untuk mendapatkan nama.
Apa yang Anda mungkin atau mungkin tidak tahu, adalah bahwa fungsi ini juga menerima database_id
opsional argumen yang memberi tahu SQL Server database mana object_id
milik.
Secara default, SQL Server mengasumsikan bahwa object_id
dalam konteks database saat ini. Dalam hal ini, kueri yang mereferensikan object_id
di database lain akan mengembalikan NULL atau (bahkan lebih buruk) hasil yang salah.
Contoh 1 – Query Lokal (dari Database Saat Ini)
Pertama, inilah kueri lokal yang mengembalikan nama objek dari database saat ini:
GUNAKAN Musik;PILIH nama AS [Kunci Asing], OBJECT_NAME(parent_object_id) AS [Nama Objek Induk], OBJECT_NAME(referenced_object_id) AS [Nama Objek yang Direferensikan]FROM Music.sys.foreign_keysWHERE name ='FK_Artists_Country';
Hasil:
Mengubah konteks basis data menjadi 'Musik'.+--------------------+----------------- -----+--------------------------+| Kunci Asing | Nama Objek Induk | Nama Objek yang Direferensikan ||--------------------+-----------------------+- -------------------------|| FK_Artists_Country | Artis | Negara |+--------------------+----------------------+--- -----------------------+(1 baris terpengaruh)
Hasil ini benar.
Ini bukan kueri lintas basis data. Ini hanyalah sebuah contoh untuk menunjukkan bagaimana fungsi ini digunakan saat mendapatkan nama objek dari database saat ini.
Contoh 2 – Kueri Lintas-Database dengan HASIL YANG SALAH!
Sekarang, inilah kueri lintas basis data yang menghasilkan hasil yang salah.
GUNAKAN WideWorldImportersDW;SELECT name AS [Foreign Key], OBJECT_NAME(parent_object_id) AS [Parent Object Name], OBJECT_NAME(referenced_object_id) AS [Referensi Nama Objek]FROM Music.sys.foreign_keysWHERE name ='FK_Artists_Country';>Hasil:
Mengubah konteks database menjadi 'WideWorldImportersDW'.+--------------------+----------------- -----+-----------------------------+| Kunci Asing | Nama Objek Induk | Nama Objek yang Direferensikan ||--------------------+-----------------------+- ----------------------------|| FK_Artists_Country | Kunci Kota | PK_Dimension_Payment_Method |+--------------------+----------------------+--- --------------------------+(1 baris terpengaruh)Yang saya lakukan hanyalah beralih ke database yang berbeda, lalu menjalankan kueri yang sama lagi.
Anda akan melihat bahwa
FROM
saya klausa menggunakan nama tiga bagian untuk menentukan nama database (Music
). Ini memungkinkan kunci asing yang benar ditemukan. Namun, ini tidak cukup untuk mencegah terjadinya masalah.Ternyata,
WideWorldImportersDW
database memiliki objek denganobject_id
yang sama yang digunakan dalamMusic
basis data. Satu-satunya masalah adalah bahwa mereka adalah objek yang sama sekali berbeda, dengan nama yang berbeda. Jadi hasil di dua kolom terakhir adalah palsu. Ini adalah nama objek yang salah, pada database yang salah. Permintaan lintas-basis data saya telah berhasil dan mengembalikan objek yang salah!Ini sangat berbahaya, karena jika saya tidak memperhatikan, hasil ini mungkin tampak baik-baik saja. Lagi pula, saya tidak mendapatkan kesalahan.
Jika ID objek ini tidak ada di database ini, saya mungkin akan mendapatkan nilai NULL (yang mungkin memudahkan untuk mendeteksi ada yang salah dengan hasilnya).
Bagaimanapun, hasilnya hanya salah .
Contoh 3 – Kueri Lintas-Database dengan Hasil yang BENAR
Untuk memperbaiki contoh sebelumnya (tanpa mengubah database saat ini), kita perlu menyediakan ID database yang kita inginkan untuk nama objek.
Seperti ini:
GUNAKAN WideWorldImportersDW;SELECT name AS [Foreign Key], OBJECT_NAME(parent_object_id, 5) AS [Parent Object Name], OBJECT_NAME(referenced_object_id, 5) AS [Referensi Nama Objek]FROM Music.sys.foreign_keysWHERE name ='FK'_Artists_;Hasil:
Mengubah konteks database menjadi 'WideWorldImportersDW'.+--------------------+----------------- -----+--------------------------+| Kunci Asing | Nama Objek Induk | Nama Objek yang Direferensikan ||--------------------+-----------------------+- -------------------------|| FK_Artists_Country | Artis | Negara |+--------------------+----------------------+--- -----------------------+(1 baris terpengaruh)Sekali lagi, untuk memperjelas, database saat ini adalah
WideWorldImportersDW
, tetapi objek berada di database berbeda yang disebutMusic
, yang memiliki ID database 5.Contoh 4 – Cara Mendapatkan ID Database
Kemungkinan besar Anda tidak akan tahu ID database apa yang ada di kepala Anda. Anda mungkin tahu nama databasenya, tapi bukan ID-nya.
Untungnya Anda dapat menggunakan
DB_ID()
berfungsi untuk mengembalikan ID database, berdasarkan namanya.Oleh karena itu, kita dapat memodifikasi contoh sebelumnya sebagai berikut:
GUNAKAN WideWorldImportersDW;SELECT name AS [Foreign Key], OBJECT_NAME(parent_object_id, DB_ID('Music')) AS [Parent Object Name], OBJECT_NAME(referenced_object_id, DB_ID('Music')) SEBAGAI [Nama Objek yang Direferensikan]FROM Music.sys.foreign_keysWHERE name ='FK_Artists_Country';Hasil:
Mengubah konteks database menjadi 'WideWorldImportersDW'.+--------------------+----------------- -----+--------------------------+| Kunci Asing | Nama Objek Induk | Nama Objek yang Direferensikan ||--------------------+-----------------------+- -------------------------|| FK_Artists_Country | Artis | Negara |+--------------------+----------------------+--- -----------------------+(1 baris terpengaruh)