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

7 cách trả lại tất cả các bảng bằng khóa chính trong SQL Server

Nếu bạn từng thấy mình cần tìm tất cả các bảng có khóa chính trong SQL Server, thì bài viết này có thể giúp ích cho bạn.

Bài viết này cung cấp bảy cách để trả về tất cả các bảng trong cơ sở dữ liệu hiện tại có khóa chính.

Lưu ý rằng hầu hết các ví dụ này chỉ trả về các bảng - không trả về chính các khóa chính. Nếu bạn muốn có danh sách các khóa chính, hãy xem 11 cách trả lại khóa chính trong SQL Server.

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

Tùy chọn đầu tiên liên quan đến việc sử dụng OBJECTPROPERTY() khi truy vấn sys.tables chế độ xem hệ thống. Hàm này chấp nhận một TableHasPrimaryKey lý lẽ. Nếu đối số này có giá trị là 1 , chúng tôi nhận được tất cả các bảng có khóa chính (nếu đó là 0 thì chúng tôi nhận được tất cả các bảng không có khóa chính).

 SELECT SCHEMA_NAME (schema_id) AS [Schema], tên AS [Table] FROM sys.tablesWHERE OBJECTPROPERTY (object_id, 'TableHasPrimaryKey') =1ORDER BY [Schema], [Table]; 

Kết quả:

 + ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ || dbo | Đất nước || dbo | Thể loại | + ---------- + --------- + 

Trong ví dụ này, cơ sở dữ liệu hiện tại có bốn bảng với một khóa chính.

Các ví dụ còn lại sẽ truy vấn cùng một cơ sở dữ liệu, vì vậy kết quả sẽ giống nhau cho các truy vấn đó.

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

Ví dụ này sử dụng OBJECTPROPERTY() một lần nữa, nhưng lần này tôi đang truy vấn INFORMATION_SCHEMA.TABLES xem.

 SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY (OBJECT_ID (CONCAT (TABLE_SCHEMA, '.', TABLE_NAME)), 'TableHasPrimaryKey') =1 ANDTABLE_TYPE ='BASE TABLE'ORDER; 
 Kết quả:

 + ---------------- + -------------- + | TABLE_SCHEMA | TABLE_NAME || ---------------- + -------------- || dbo | Album || dbo | Nghệ sĩ || dbo | Đất nước || dbo | Thể loại | + ---------------- + -------------- + 

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

Một lần nữa OBJECTPROPERTY() đến để giải cứu. Lần này tôi đang truy vấn sys.objects chế độ xem hệ thống.

 SELECT SCHEMA_NAME (schema_id) AS [Schema], tên AS [Table] FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY (OBJECT_ID (CONCAT (SCHEMA_NAME (schema_id),'. ', name)),' TableHasPrimaryKey ') =1ORDER BY [Lược đồ], [Bảng] 

Kết quả:

 + ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ || dbo | Đất nước || dbo | Thể loại | + ---------- + --------- + 

Tùy chọn 4 - INFORMATION_SCHEMA.TABLE_CONSTRAINTS

Bạn có thể truy vấn INFORMATION_SCHEMA.TABLE_CONSTRAINTS xem để nhận danh sách các bảng có khóa chính. Bạn cần lọc kết quả để chỉ những hàng có CONSTRAINT_TYPE trong tổng số PRIMARY KEY .

 SELECT CONSTRAINT_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='PRIMARY KEY'; 

Kết quả:

 + --------------------- + -------------- + | CONSTRAINT_SCHEMA | TABLE_NAME || --------------------- + -------------- || dbo | Nghệ sĩ || dbo | Thể loại || dbo | Album || dbo | Quốc gia | + --------------------- + -------------- + 

Dạng xem này cũng trả về tên ràng buộc, vì vậy bạn cũng có thể bao gồm cột đó nếu cần:

 SELECT CONSTRAINT_SCHEMA, TABLE_NAME, CONSTRAINT_NAMEFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='PRIMARY KEY'; 

Kết quả:

 + --------------------- + -------------- + --------- ---------------------- + | CONSTRAINT_SCHEMA | TABLE_NAME | CONSTRAINT_NAME || --------------------- + -------------- + ---------- --------------------- || dbo | Nghệ sĩ | PK__Artists__25706B50FCD918B1 || dbo | Thể loại | PK__Genres__0385057E88BB96F8 || dbo | Album | PK__Albums__97B4BE379FC780BD || dbo | Quốc gia | PK__Country__10D1609F97ADEC31 | + --------------------- + -------------- + ---------- --------------------- + 

Tùy chọn 5 - sys.key_constraints

Bạn có thể lọc sys.key_constraints xem một CONSTRAINT_TYPE của PK để nhận danh sách các bảng có khóa chính.

 CHỌN SCHEMA_NAME (schema_id) AS [Schema], OBJECT_NAME (parent_object_id) AS [Table] FROM sys.key_constraints WHERE type ='PK'; 

Kết quả:

 + ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Nghệ sĩ || dbo | Thể loại || dbo | Album || dbo | Quốc gia | + ---------- + --------- + 

Đây lại là tên khóa chính:

 SELECT SCHEMA_NAME (schema_id) AS [Schema], OBJECT_NAME (parent_object_id) AS [Table], nameFROM sys.key_constraints WHERE type ='PK'; 

Kết quả:

 + ---------- + --------- + ------------------------- ------ + | Lược đồ | Bảng | tên || ---------- + --------- + -------------------------- ----- || dbo | Nghệ sĩ | PK__Artists__25706B50FCD918B1 || dbo | Thể loại | PK__Genres__0385057E88BB96F8 || dbo | Album | PK__Albums__97B4BE379FC780BD || dbo | Quốc gia | PK__Country__10D1609F97ADEC31 | + ---------- + --------- + -------------------------- ----- + 

Tùy chọn 6 - sys.objects

sys.objects chế độ xem hệ thống là một chế độ xem phổ biến để trả về thông tin về các đối tượng trong phạm vi lược đồ, bao gồm cả các khóa chính.

 SELECT SCHEMA_NAME (schema_id) AS [Schema], OBJECT_NAME (parent_object_id) AS [Table] FROM sys.objects WHERE type ='PK'; 

Kết quả:

 + ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Nghệ sĩ || dbo | Thể loại || dbo | Album || dbo | Quốc gia | + ---------- + --------- + 

Như với hai ví dụ trước, chúng ta có thể bao gồm name của chế độ xem này để hiển thị tên của khóa chính:

 SELECT SCHEMA_NAME (schema_id) AS [Schema], OBJECT_NAME (parent_object_id) AS [Table], nameFROM sys.objects WHERE type ='PK'; 

Kết quả:

 + ---------- + --------- + ------------------------- ------ + | Lược đồ | Bảng | tên || ---------- + --------- + -------------------------- ----- || dbo | Nghệ sĩ | PK__Artists__25706B50FCD918B1 || dbo | Thể loại | PK__Genres__0385057E88BB96F8 || dbo | Album | PK__Albums__97B4BE379FC780BD || dbo | Quốc gia | PK__Country__10D1609F97ADEC31 | + ---------- + --------- + -------------------------- ----- + 

Tùy chọn 7 - OBJECTPROPERTYEX ()

OBJECTPROPERTYEX() hàm hoạt động giống như OBJECTPROPERTY() chức năng, ngoại trừ việc nó hỗ trợ nhiều thuộc tính hơn. Do đó, bất kỳ ví dụ nào trước đây sử dụng OBJECTPROPERTY() , có thể dễ dàng được viết lại để sử dụng OBJECTPROPERTYEX() .

Ví dụ:tôi có thể viết lại ví dụ đầu tiên trên trang này thành như sau:

 SELECT SCHEMA_NAME (schema_id) AS [Schema], tên AS [Table] FROM sys.tablesWHERE OBJECTPROPERTYEX (object_id, 'TableHasPrimaryKey') =1ORDER BY [Schema], [Table]; 

Kết quả:

 + ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ || dbo | Đất nước || dbo | Thể loại | + ---------- + --------- + 

Tôi nên đề cập rằng OBJECTPROPERTYEX() trả về sql_variant kiểu dữ liệu, trong khi OBJECTPROPERTY() trả về một int .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL:Chọn tên cột động dựa trên biến

  2. Giới thiệu về bảng tạm thời trong SQL Server

  3. Tại sao tôi không thể thực hiện một hàm tổng hợp trên một biểu thức có chứa một tổng thể nhưng tôi có thể làm như vậy bằng cách tạo một câu lệnh select mới xung quanh nó?

  4. Cách tổng hợp trường thời gian trong SQL Server

  5. Ghi đè Trình tối ưu hóa truy vấn cho T-SQL của bạn tham gia với FORCEPLAN