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
và @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.