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ụngtype = '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)