Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

3 cách trả về tất cả các bảng KHÔNG có khóa chính trong SQL Server

Nếu bạn cần tìm hiểu liệu cơ sở dữ liệu có bất kỳ bảng nào không có khóa chính hay không, bạn có thể chạy bất kỳ tập lệnh nào sau đây trong SQL Server để chỉ trả lại các bảng đó.

Tất cả các tập lệnh này đều tận dụng lợi thế của OBJECTPROPERTY() hàm số. Hàm này chấp nhận một TableHasPrimaryKey đối số mà bạn có thể kiểm tra giá trị của 0 . Nếu đó là 0 , bảng không có khóa chính. Nếu đó là 1 nó có. Do đó, bạn cũng có thể sử dụng chức năng này để trả về tất cả các bảng với một khóa chính.

Các tập lệnh này chỉ trả về tên của bảng và giản đồ của nó, nhưng bạn luôn có thể sửa đổi chúng để trả về nhiều cột hơn.

Tùy chọn 1 - OBJECTPROPERTY () với sys.tables

sys.tables chế độ xem hệ thống có lẽ là nơi bắt đầu rõ ràng nhất. Dạng xem này trả về một hàng cho mỗi bảng người dùng và khi chúng tôi sử dụng OBJECTPROPERTY() để lọc kết quả dựa trên TableHasPrimaryKey thuộc tính 0 , chúng tôi chỉ lấy những bảng đó mà không có khóa chính.

 Kiểm tra SỬ DỤNG; CHỌN SCHEMA_NAME (schema_id) NHƯ [Lược đồ], tên NHƯ [Bảng] TỪ sys.tablesWHERE OBJECTPROPERTY (object_id, 'TableHasPrimaryKey') =0ORDER BY [Schema], [Table]; 

Kết quả:

 Đã thay đổi ngữ cảnh cơ sở dữ liệu thành 'Kiểm tra'. + ---------- + -------------------- + | Lược đồ | Bảng || ---------- + -------------------- || dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Cá nhân || dbo | Nghề nghiệp || dbo | Đội ngũ || dbo | TimeTest | + ---------- + -------------------- + (7 hàng bị ảnh hưởng) 

Trong trường hợp này, cơ sở dữ liệu hiện tại của tôi là cơ sở dữ liệu thử nghiệm với một loạt các bảng không có khóa chính.

Nếu tôi chạy cùng một câu lệnh trên cơ sở dữ liệu khác, tôi không nhận được kết quả nào:

 SỬ DỤNG Nhạc; CHỌN SCHEMA_NAME (schema_id) NHƯ [Lược đồ], tên NHƯ [Bảng] TỪ sys.tablesWHERE OBJECTPROPERTY (object_id, 'TableHasPrimaryKey') =0ORDER BY [Schema], [Table]; 

Kết quả:

 Đã thay đổi ngữ cảnh cơ sở dữ liệu thành 'Nhạc'. (0 hàng bị ảnh hưởng) 

Tùy chọn 2 - OBJECTPROPERTY () với INFORMATION_SCHEMA.TABLES

Ví dụ này tương tự như ví dụ trước, ngoại trừ lần này tôi đang truy vấn INFORMATION_SCHEMA.TABLES lượt xem. Các dạng xem lược đồ thông tin có trong SQL Server tuân thủ định nghĩa tiêu chuẩn ISO cho INFORMATION_SCHEMA.

 Kiểm tra SỬ DỤNG; SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY (OBJECT_ID (CONCAT (TABLE_SCHEMA, '.', TABLE_NAME)), 'TableHasPrimaryKey') =0 ANDTABLE_TYPE ='BASE TABLE'ORD> 

Kết quả:

 Đã thay đổi ngữ cảnh cơ sở dữ liệu thành 'Kiểm tra'. + ---------------- + -------------------- + | TABLE_SCHEMA | TABLE_NAME || ---------------- + -------------------- || dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Cá nhân || dbo | Nghề nghiệp || dbo | Đội ngũ || dbo | TimeTest | + ---------------- + -------------------- + (7 hàng bị ảnh hưởng) 

Tùy chọn 3 - OBJECTPROPERTY () với sys.objects

Trong ví dụ này, tôi truy vấn sys.objects lượt xem. Đây là chế độ xem tổng quát hơn khi so sánh với hai chế độ trước và nó trả về thông tin về các đối tượng trong phạm vi lược đồ (không chỉ là bảng). Do đó, chúng tôi cần lọc kết quả bằng cách sử dụng type = 'U' . U ở đây là viết tắt của bảng do người dùng xác định.

Một lần nữa, chúng ta có thể sử dụng OBJECTPROPERTY() chức năng lọc kết quả để chỉ lọc những bảng không có khóa chính.

 Kiểm tra SỬ DỤNG; CHỌN SCHEMA_NAME (schema_id) AS [Giản đồ], tên AS [Bảng] FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY (OBJECT_ID (CONCAT (SCHEMA_NAME (schema_id),'. ', name)) , 'TableHasPrimaryKey') =0ORDER BY [Lược đồ], [Bảng] 

Kết quả:

 Đã thay đổi ngữ cảnh cơ sở dữ liệu thành 'Kiểm tra'. + ---------- + -------------------- + | Lược đồ | Bảng || ---------- + -------------------- || dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Cá nhân || dbo | Nghề nghiệp || dbo | Đội ngũ || dbo | TimeTest | + ---------- + -------------------- + (7 hàng bị ảnh hưởng) 

Ngoài ra, chúng tôi có thể lọc nó theo type_desc = 'USER_TABLE' , điều này sẽ tạo ra cùng một kết quả.

 SỬ DỤNG Kiểm tra; CHỌN SCHEMA_NAME (schema_id) AS [Schema], tên AS [Table] FROM sys.objects WHERE type_desc ='USER_TABLE'AND OBJECTPROPERTY (OBJECT_ID (CONCAT (SCHEMA_NAME (schema_id),'. ', name)) , 'TableHasPrimaryKey') =0ORDER BY [Lược đồ], [Bảng] 

Kết quả:

 Đã thay đổi ngữ cảnh cơ sở dữ liệu thành 'Kiểm tra'. + ---------- + -------------------- + | Lược đồ | Bảng || ---------- + -------------------- || dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Cá nhân || dbo | Nghề nghiệp || dbo | Đội ngũ || dbo | TimeTest | + ---------- + -------------------- + (7 hàng bị ảnh hưởng) 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Liên minh máy chủ Sql nhưng giữ trật tự

  2. SQL Server 2016:View Designer

  3. SQL, Làm thế nào để kết hợp các kết quả?

  4. Sử dụng DATABASEPROPERTYEX () để trả lại cài đặt cơ sở dữ liệu trong SQL Server

  5. Làm cách nào để chèn một bảng dữ liệu vào bảng cơ sở dữ liệu SQL Server?