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

3 Cara Mengembalikan Semua Tabel TANPA Kunci Utama di SQL Server

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_SCHEMA 

Hasil:

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 menggunakan type = '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)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa melakukan pernyataan UPDATE dengan JOIN di SQL Server?

  2. Apa itu DATALENGTH() di SQL Server?

  3. SQL Server Standard Edition Ketersediaan Tinggi Berjangka

  4. SQL Server (localdb)\v11.0 dijelaskan

  5. Mengotomatiskan Pemulihan Uji Basis Data di SQL Server