Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara Mendapatkan OBJECT_NAME() dari Database Berbeda di SQL Server

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 dengan object_id yang sama yang digunakan dalam Music 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 disebut Music , 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)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menginstal sqlcmd &bcp di Ubuntu

  2. Bagaimana cara memasukkan jumlah total baris yang dikembalikan dalam hasil dari perintah SELECT T-SQL?

  3. Peningkatan identitas melompat di database SQL Server

  4. Kesalahan JDBC SQL Server di Java 8:Pengandar tidak dapat membuat sambungan aman ke SQL Server dengan menggunakan enkripsi Secure Sockets Layer (SSL)

  5. Gunakan OBJECTPROPERTY() untuk Mengetahui apakah Tabel adalah Tabel Sistem di SQL Server