Jika Anda perlu mencari tahu apakah database memiliki tabel yang tidak memiliki kunci utama, Anda dapat menjalankan salah satu skrip berikut di SQL Server untuk mengembalikan tabel tersebut saja.
Semua skrip ini memanfaatkan OBJECTPROPERTY()
fungsi. Fungsi ini menerima TableHasPrimaryKey
argumen bahwa Anda dapat memeriksa nilai 0
. Jika 0
, tabel tidak memiliki kunci utama. Jika 1
itu tidak. Oleh karena itu, Anda juga dapat menggunakan fungsi ini untuk mengembalikan semua tabel dengan kunci utama.
Skrip ini hanya mengembalikan nama tabel dan skemanya, tetapi Anda selalu dapat memodifikasinya untuk mengembalikan lebih banyak kolom.
Opsi 1 – OBJECTPROPERTY() dengan sys.tables
sys.tables
tampilan sistem mungkin adalah tempat yang paling jelas untuk memulai. Tampilan ini mengembalikan baris untuk setiap tabel pengguna, dan ketika kita menggunakan OBJECTPROPERTY()
untuk memfilter hasil berdasarkan TableHasPrimaryKey
properti menjadi 0
, kami hanya mendapatkan tabel tersebut tanpa kunci utama.
USE Test;SELECT SCHEMA_NAME(schema_id) AS [Schema], nama AS [Table]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Schema], [Table];
Hasil:
Mengubah konteks database menjadi 'Test'.+----------+--------------------+| Skema | Tabel ||----------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Individu || dbo | Pekerjaan || dbo | Tim || dbo | TimeTest |+----------+--------------------+(7 baris terpengaruh)
Dalam hal ini, database saya saat ini adalah database pengujian dengan sekumpulan tabel tanpa kunci utama.
Jika saya menjalankan pernyataan yang sama di database lain, saya tidak mendapatkan hasil:
GUNAKAN Musik;SELECT SCHEMA_NAME(schema_id) AS [Schema], nama AS [Table]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Schema], [Table];
Hasil:
Mengubah konteks basis data menjadi 'Musik'.(0 baris terpengaruh)
Opsi 2 – OBJECTPROPERTY() dengan INFORMATION_SCHEMA.TABLES
Contoh ini mirip dengan yang sebelumnya, kecuali kali ini saya menanyakan INFORMATION_SCHEMA.TABLES
melihat. Tampilan skema informasi yang disertakan dalam SQL Server sesuai dengan definisi standar ISO untuk INFORMATION_SCHEMA.
UJI PENGGUNAAN;SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasPrimaryKey') =0 ANDTABLE_TYPE='BASE TABLE_SCHEMAHasil:
Mengubah konteks database menjadi 'Test'.+----------------+--------------------+ | TABLE_SCHEMA | NAMA_TABEL ||----------------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Individu || dbo | Pekerjaan || dbo | Tim || dbo | TimeTest |+----------------+--------------------+(7 baris terpengaruh)Opsi 3 – OBJECTPROPERTY() dengan sys.objects
Dalam contoh ini, saya menanyakan
sys.objects
melihat. Ini adalah tampilan yang lebih umum jika dibandingkan dengan dua sebelumnya, dan mengembalikan informasi tentang objek cakupan skema (bukan hanya tabel). Karena itu, kita perlu memfilter hasil menggunakantype = 'U'
.U
di sini adalah singkatan dari tabel yang ditentukan pengguna.Sekali lagi, kita dapat menggunakan
OBJECTPROPERTY()
berfungsi untuk memfilter hasil hanya ke tabel yang tidak memiliki kunci utama.USE Test;SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table]FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name))) , 'TableHasPrimaryKey') =0ORDER OLEH [Skema], [Tabel]Hasil:
Mengubah konteks database menjadi 'Test'.+----------+--------------------+| Skema | Tabel ||----------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Individu || dbo | Pekerjaan || dbo | Tim || dbo | TimeTest |+----------+--------------------+(7 baris terpengaruh)Sebagai alternatif, kita dapat memfilternya dengan
type_desc = 'USER_TABLE'
, yang akan menghasilkan hasil yang sama.USE Test;SELECT SCHEMA_NAME(schema_id) AS [Schema], nama AS [Table]FROM sys.objects WHERE type_desc ='USER_TABLE'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)) , 'TableHasPrimaryKey') =0ORDER OLEH [Skema], [Tabel]Hasil:
Mengubah konteks database menjadi 'Test'.+----------+--------------------+| Skema | Tabel ||----------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Individu || dbo | Pekerjaan || dbo | Tim || dbo | TimeTest |+----------+--------------------+(7 baris terpengaruh)