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

Trả về tất cả các khóa ngoại tham chiếu đến một bảng đã cho trong SQL Server

Nếu bạn cần trả lại tất cả các khóa ngoại tham chiếu đến một bảng nhất định trong SQL Server, hãy thử một trong các phương pháp sau.

Phương thức đầu tiên truy vấn sys.foreign_keys chế độ xem hệ thống. Phương thức thứ hai thực thi sp_fkeys hệ thống lưu trữ thủ tục.

Tùy chọn 1 - sys.foreign_keys

Đoạn mã sau truy xuất tất cả các khóa ngoại tham chiếu đến một bảng nhất định, cùng với các bảng khóa chính và khóa ngoại. Tôi cũng bao gồm lược đồ cho các bảng khóa ngoại.

USE WideWorldImportersDW;
SELECT 
  OBJECT_NAME(referenced_object_id) AS [PK Table],
  name AS [Foreign Key],
  SCHEMA_NAME(schema_id) AS [FK Schema],
  OBJECT_NAME(parent_object_id) AS [FK Table]
FROM sys.foreign_keys
WHERE referenced_object_id = OBJECT_ID('Dimension.City');

Kết quả:

+------------+---------------------------------------+-------------+------------+
| PK Table   | Foreign Key                           | FK Schema   | FK Table   |
|------------+---------------------------------------+-------------+------------|
| City       | FK_Fact_Order_City_Key_Dimension_City | Fact        | Order      |
| City       | FK_Fact_Sale_City_Key_Dimension_City  | Fact        | Sale       |
+------------+---------------------------------------+-------------+------------+

Trong trường hợp này, tôi đang sử dụng WideWorldImportersDW cơ sở dữ liệu và tôi đang trả về các khóa ngoại tham chiếu đến Dimension.City bảng (Dimension.City bảng chứa cột khóa chính mà khóa ngoại tham chiếu).

Tùy chọn 2 - sp_fkeys

Một cách khác để lấy các khóa ngoại tham chiếu đến một bảng cụ thể là sử dụng sp_fkeys hệ thống lưu trữ thủ tục. Thủ tục được lưu trữ này cung cấp cho chúng tôi lựa chọn nhận khóa ngoại dựa trên (trong số những thứ khác) bảng tham chiếu hoặc bảng tham chiếu.

Trong trường hợp này, chúng tôi muốn nhận các khóa ngoại tham chiếu đến một bảng nhất định, vì vậy chúng tôi có thể thực hiện việc này:

EXEC sp_fkeys 
  @pktable_name = 'City', 
  @pktable_owner = 'Dimension';

Kết quả (sử dụng đầu ra dọc):

-[ RECORD 1 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | City
PKCOLUMN_NAME     | City Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Order
FKCOLUMN_NAME     | City Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Order_City_Key_Dimension_City
PK_NAME           | PK_Dimension_City
DEFERRABILITY     | 7
-[ RECORD 2 ]-------------------------
PKTABLE_QUALIFIER | WideWorldImportersDW
PKTABLE_OWNER     | Dimension
PKTABLE_NAME      | City
PKCOLUMN_NAME     | City Key
FKTABLE_QUALIFIER | WideWorldImportersDW
FKTABLE_OWNER     | Fact
FKTABLE_NAME      | Sale
FKCOLUMN_NAME     | City Key
KEY_SEQ           | 1
UPDATE_RULE       | 1
DELETE_RULE       | 1
FK_NAME           | FK_Fact_Sale_City_Key_Dimension_City
PK_NAME           | PK_Dimension_City
DEFERRABILITY     | 7

Điều này có thể dễ dàng được chuyển đổi để tìm kiếm khóa ngoại dựa trên bảng khóa ngoại chỉ bằng cách thay thế các tham số bằng @fktable_name@fktable_owner :

EXEC sp_fkeys 
  @fktable_name = 'Order', 
  @fktable_owner = 'Fact';

Kiểm tra Đúng / Sai

Nếu bạn chỉ muốn biết liệu một bảng có được tham chiếu bởi khóa ngoại hay không, nhưng bạn không muốn liệt kê tất cả, hãy xem Kiểm tra xem bảng có được tham chiếu bởi khóa ngoại trong SQL Server với OBJECTPROPERTY () hay không.

Bài viết đó sử dụng TableHasForeignRef đối số của OBJECTPROPERTY() hàm trả về 1 nếu bảng được tham chiếu bởi khóa ngoại và 0 nếu khô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. datetime so với datetimeoffset trong SQL Server:Sự khác biệt là gì?

  2. Cách sử dụng tham số với LIKE trong Sql Server Compact Edition

  3. TransactSQL để chạy một tập lệnh TransactSQL khác

  4. Cách tạo nhiều cái cho một cái

  5. 4 cách để tìm hiểu những cột nào sẽ được trả về bởi một thủ tục được lưu trữ trong SQL Server