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

7 cách trả về tất cả các bảng có khóa ngoại trong SQL Server

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

Mỗi bảng chỉ được trả về một lần, bất kể nó có bao nhiêu khóa ngoại. Điều này khác với việc trả về tất cả các khóa ngoại, cùng với các bảng của chúng. Nếu bạn muốn làm điều đó, hãy xem 11 cách trả về khóa ngoại trong SQL Server.

Tất cả các ví dụ ở đây đều truy vấn cùng một cơ sở dữ liệu và do đó trả về cùng một kết quả.

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

Tùy chọn đầu tiên là 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 TableHasForeignKey đối số sẽ là 1 hoặc 0 (hoặc NULL ). Nếu đó là 1 , điều này có nghĩa là bảng có khóa ngoại. Giá trị 0 có nghĩa là nó không có bất kỳ khóa ngoại nào. Do đó, chúng ta có thể sử dụng điều này trong WHERE mệnh đề chỉ trả về những bảng trong đó TableHasForeignKey được đặt thành 1 .

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

Kết quả:

 + ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ | + ---------- + --------- + 

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

Ví dụ này sử dụng OBJECTPROPERTY() khi truy vấn INFORMATION_SCHEMA.TABLES chế độ xem hệ thống.

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

 + ---------------- + -------------- + | TABLE_SCHEMA | TABLE_NAME || ---------------- + -------------- || dbo | Album || dbo | Nghệ sĩ | + ---------------- + -------------- + 

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

Đây là một tùy chọn khác sử dụng OBJECTPROPERTY() . Lần này tôi sử dụng nó khi 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)),' TableHasForeignKey ') =1ORDER BY [Lược đồ], [Bảng] 

Kết quả:

 + ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ | + ---------- + --------- + 

Tùy chọn 4 - INFORMATION_SCHEMA.TABLE_CONSTRAINTS với DISTINCT

Đây là một ví dụ truy vấn INFORMATION_SCHEMA.TABLE_CONSTRAINTS chế độ xem hệ thống trong đó loại ràng buộc là FOREIGN KEY . Trong trường hợp này, tôi cũng sử dụng DISTINCT để ngăn các bảng được trả về nhiều lần khi chúng có nhiều hơn một khóa ngoại.

 CHỌN DISTINCT CONSTRAINT_SCHEMA, TABLE_NAME TỪ INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='NGOẠI KHÓA'; 

Kết quả:

 + --------------------- + -------------- + | CONSTRAINT_SCHEMA | TABLE_NAME || --------------------- + -------------- || dbo | Album || dbo | Nghệ sĩ | + --------------------- + -------------- + 

Đây là những gì sẽ xảy ra nếu tôi xóa DISTINCT mệnh đề:

 CHỌN CONSTRAINT_SCHEMA, TABLE_NAME TỪ INFORMATION_SCHEMA.TABLE_CONSTRAINTSWHERE CONSTRAINT_TYPE ='NGOẠI KHÓA'; 

Kết quả:

 + --------------------- + -------------- + | CONSTRAINT_SCHEMA | TABLE_NAME || --------------------- + -------------- || dbo | Album || dbo | Album || dbo | Nghệ sĩ | + --------------------- + -------------- + 

Trong trường hợp này, Albums bảng có hai khóa ngoại và vì vậy tôi nhận được hai hàng cho một bảng đó.

Tùy chọn 5 - sys.foreign_keys với DISTINCT

Đây là một ví dụ khác sử dụng DISTINCT nhưng lần này tôi đang truy vấn sys.foreign_keys chế độ xem hệ thống.

 CHỌN DISTINCT OBJECT_SCHEMA_NAME (fk.parent_object_id) AS [Schema], OBJECT_NAME (fk.parent_object_id) AS [Table] FROM sys.foreign_keys AS fkORDER BY [Schema], [Table]; 

Kết quả:

 + ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ | + ---------- + --------- + 

Và ở đây nó không có DISTINCT mệnh đề:

 SELECT OBJECT_SCHEMA_NAME (fk.parent_object_id) AS [Schema], OBJECT_NAME (fk.parent_object_id) AS [Table] FROM sys.foreign_keys AS fkORDER BY [Schema], [Table]; 

Kết quả:

 + ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Album || dbo | Nghệ sĩ | + ---------- + --------- + 

Tùy chọn 6 - sys.foreign_keys với GROUP BY

Ví dụ này tương tự như ví dụ trước ở chỗ nó truy vấn sys.foreign_keys chế độ xem hệ thống. Sự khác biệt là ở chỗ, thay vì sử dụng DISTINCT , nó sử dụng GROUP BY thay vào đó mệnh đề.

 CHỌN OBJECT_SCHEMA_NAME (fk.parent_object_id) AS [Schema], OBJECT_NAME (fk.parent_object_id) AS [Table] FROM sys.foreign_keys AS fkGROUP BY OBJECT_SCHEMA_NAME (fk.parent_object_id), OBJECT_NAME (fk.idp); 

Kết quả:

 + ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ | + ---------- + --------- + 

Tùy chọn 7 - OBJECTPROPERTYEX ()

Ví dụ này có thể tăng gấp đôi so với một số ví dụ trước đó, nhưng nó vẫn đáng được đề cập.

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() hàm số. Hàm này về cơ bản là một phần mở rộng cho OBJECTPROPERTY() và nó thực hiện mọi thứ OBJECTPROPERTY() và hơn thế nữa.

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

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

Kết quả:

 + ---------- + --------- + | Lược đồ | Bảng || ---------- + --------- || dbo | Album || dbo | Nghệ sĩ | + ---------- + --------- + 

Một điểm khác biệt mà bạn nên biết là hai hàm này trả về các kiểu trả về khác nhau. OBJECTPROPERTY() trả về một int trong khi OBJECTPROPERTYEX() trả về sql_variant loại.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách bỏ thuộc tính nhận dạng của một cột trong bảng SQL Server - Hướng dẫn sử dụng SQL Server / T-SQL 44

  2. Cách chỉ định tên khóa chính trong EF-Code-First

  3. Cài đặt Ubuntu 18.04 cho SQL Server 2019 trên máy ảo bằng VMware Workstation

  4. datetime2 so với datetimeoffset trong SQL Server:Sự khác biệt là gì?

  5. Nhóm luôn sẵn sàng của SQL Server:Cài đặt và cấu hình, Phần 2