Artikel ini menawarkan tujuh cara untuk mengembalikan semua tabel yang memiliki kunci asing dalam database di SQL Server.
Setiap tabel dikembalikan hanya sekali, terlepas dari berapa banyak kunci asing yang dimilikinya. Ini berbeda dengan mengembalikan semua kunci asing, bersama dengan tabelnya. Jika Anda ingin melakukannya, lihat 11 Cara Mengembalikan Kunci Asing di SQL Server.
Semua contoh di sini meminta database yang sama, dan karena itu mengembalikan hasil yang sama.
Opsi 1 – OBJECTPROPERTY() dengan sys.tables
Opsi pertama adalah menggunakan OBJECTPROPERTY()
berfungsi saat menanyakan sys.tables
tampilan sistem.
Fungsi ini menerima TableHasForeignKey
argumen, yang akan berupa 1
atau 0
(atau NULL
). Jika 1
, ini berarti tabel tersebut memang memiliki kunci asing. Nilai 0
berarti tidak memiliki kunci asing. Oleh karena itu, kita dapat menggunakan ini dalam WHERE
klausa untuk mengembalikan hanya tabel di mana TableHasForeignKey
disetel ke 1
.
SELECT SCHEMA_NAME(schema_id) AS [Schema], nama AS [Table]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasForeignKey') =1ORDER BY [Schema], [Table];
Hasil:
+----------+--------+| Skema | Tabel ||----------+---------|| dbo | Album || dbo | Artis |+----------+--------+
Opsi 2 – OBJECTPROPERTY() dengan INFORMATION_SCHEMA.TABLES
Contoh ini menggunakan OBJECTPROPERTY()
saat menanyakan INFORMATION_SCHEMA.TABLES
tampilan sistem.
SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasForeignKey') =1 ANDTABLE_TYPE='BASE TABLE_SCHEMABY, Hasil:+----------------+--------------+| TABLE_SCHEMA | NAMA_TABEL ||----------------+--------------|| dbo | Album || dbo | Artis |+----------------+--------------+Opsi 3 – OBJECTPROPERTY() dengan sys.objects
Ini adalah opsi lain yang menggunakan
OBJECTPROPERTY()
. Kali ini saya menggunakannya ketika menanyakansys.objects
tampilan sistem.SELECT SCHEMA_NAME(schema_id) AS [Schema], nama AS [Table]FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasForeignKey ') =1ORDER BY [Skema], [Tabel]Hasil:
+----------+--------+| Skema | Tabel ||----------+---------|| dbo | Album || dbo | Artis |+----------+--------+Opsi 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS dengan DISTINCT
Berikut ini contoh kueri
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
tampilan sistem di mana jenis kendala adalahFOREIGN KEY
. Dalam hal ini, saya juga menggunakanDISTINCT
klausa untuk mencegah tabel dikembalikan lebih dari sekali ketika mereka memiliki lebih dari satu kunci asing.PILIH CONSTRAINT_SCHEMA BERBEDA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSCHEMA CONSTRAINT_TYPE ='FOREIGN KEY';Hasil:
+---------------------+--------------+| CONSTRAINT_SCHEMA | NAMA_TABEL ||---------------------+--------------|| dbo | Album || dbo | Artis |+---------------------+--------------+Inilah yang terjadi jika saya menghapus
DISTINCT
klausa:PILIH CONSTRAINT_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='FOREIGN KEY';Hasil:
+---------------------+--------------+| CONSTRAINT_SCHEMA | NAMA_TABEL ||---------------------+--------------|| dbo | Album || dbo | Album || dbo | Artis |+---------------------+--------------+Dalam hal ini
Albums
tabel memiliki dua kunci asing, jadi saya mendapatkan dua baris untuk satu tabel itu.Opsi 5 – sys.foreign_keys dengan DISTINCT
Berikut contoh lain yang menggunakan
DISTINCT
klausa, tapi kali ini saya menanyakansys.foreign_keys
tampilan sistem.PILIH BERBEDA OBJECT_SCHEMA_NAME(fk.parent_object_id) SEBAGAI [Skema], OBJECT_NAME(fk.parent_object_id) SEBAGAI [Tabel]FROM sys.foreign_keys AS fkORDER BY [Skema], [Tabel];Hasil:
+----------+--------+| Skema | Tabel ||----------+---------|| dbo | Album || dbo | Artis |+----------+--------+Dan ini dia tanpa
DISTINCT
klausa:SELECT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table]FROM sys.foreign_keys AS fkORDER BY [Schema], [Table];Hasil:
+----------+--------+| Skema | Tabel ||----------+---------|| dbo | Album || dbo | Album || dbo | Artis |+----------+--------+Opsi 6 – sys.foreign_keys dengan GROUP BY
Yang ini mirip dengan contoh sebelumnya karena menanyakan
sys.foreign_keys
tampilan sistem. Perbedaannya adalah, daripada menggunakanDISTINCT
klausa, ia menggunakanGROUP BY
klausa sebagai gantinya.SELECT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table]FROM sys.foreign_keys AS fkGROUP OLEH OBJECT_SCHEMA_NAME(fk.parent_object_object_id), OBJECT_NAME>Hasil:
+----------+--------+| Skema | Tabel ||----------+---------|| dbo | Album || dbo | Artis |+----------+--------+Opsi 7 – OBJECTPROPERTYEX()
Contoh ini mungkin menggandakan beberapa contoh sebelumnya, tetapi masih layak disebut.
Salah satu contoh sebelumnya yang menggunakan
OBJECTPROPERTY()
fungsi, dapat dengan mudah ditulis ulang untuk menggunakanOBJECTPROPERTYEX()
fungsi. Fungsi ini pada dasarnya adalah ekstensi dariOBJECTPROPERTY()
, dan melakukan segalanyaOBJECTPROPERTY()
lakukan dan banyak lagi.Jadi saya bisa menulis ulang contoh pertama di halaman ini dengan yang berikut:
SELECT SCHEMA_NAME(schema_id) AS [Schema], nama AS [Table]FROM sys.tablesWHERE OBJECTPROPERTYEX(object_id, 'TableHasForeignKey') =1ORDER BY [Schema], [Table];Hasil:
+----------+--------+| Skema | Tabel ||----------+---------|| dbo | Album || dbo | Artis |+----------+--------+Satu perbedaan yang harus Anda ketahui adalah bahwa kedua fungsi ini mengembalikan tipe pengembalian yang berbeda.
OBJECTPROPERTY()
mengembalikan int sedangkanOBJECTPROPERTYEX()
mengembalikan sql_variant ketik.