2011-10-21 23 views
16

Có truy vấn nào sẽ đưa cho tôi khóa ngoại được hướng vào một cột bảng cụ thể không? Ví dụ, nói rằng tôi đã có ba bảng:Tập lệnh SQL để tìm khóa ngoại cho một bảng cụ thể?

__________ 
|Table A | 
---------- 
|Id  | 
---------- 

___________ 
|Table B | 
----------- 
|Id  | 
|TableAId | (Foreign Key to TableA.Id) 
----------- 

___________ 
|Table C | 
----------- 
|Id  | 
|TableAId | (Foreign Key to TableA.Id) 
----------- 

Tôi cần một truy vấn dọc theo dòng của "Select * Phím Ngoại hướng vào TableA.Id" đó quay trở lại "Bảng C: TableAId", "Bảng B: TableAId ". Tôi đang duyệt qua một số khung nhìn hệ thống INFORMATION_SCHEMA, và có vẻ như tôi có thể dễ dàng thấy những khóa ngoại thuộc Bảng A, hoặc Bảng B riêng lẻ, nhưng tôi không thể tìm thấy ở đâu nó nói "Bảng C có khóa ngoài Bảng A "cụ thể. Tôi có thể tìm ra các chi tiết cụ thể của truy vấn, tôi không thể tìm thấy các quan điểm mà tôi đang tìm kiếm (hoặc tôi đang tìm hiểu về chúng). Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

36

Courtesy of Pinal Dave:

SELECT 
    f.name AS ForeignKey, 
    OBJECT_NAME(f.parent_object_id) AS TableName, 
    COL_NAME(fc.parent_object_id, 
    fc.parent_column_id) AS ColumnName, 
    OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName, 
    COL_NAME(fc.referenced_object_id, 
    fc.referenced_column_id) AS ReferenceColumnName 
FROM 
    sys.foreign_keys AS f 
    INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id 
+0

Cảm ơn! Điều đó sẽ làm. – Ocelot20

+0

Dude - điều này thật tuyệt vời! Tôi đã tìm kiếm một "máy phát điện tham gia" nhưng đây là sql thủ công cho nó. Tôi không thể tìm thấy một công cụ trực tuyến cho điều này (với SQL Server) - có lẽ tôi sẽ viết của riêng tôi! – SlimsGhost

0

Added thả năng động và tạo ra trên chương trình dbo.

DECLARE @l varchar(1) = char(13); 
DECLARE @referenced_object_id varchar(MAX) = 'Replace_With_PK_Table_Name'; 

SELECT 
    fk.name AS ForeignKey, 
    OBJECT_NAME(fk.parent_object_id) AS TableName, 
    COL_NAME(fkc.parent_object_id, 
    fkc.parent_column_id) AS ColumnName, 
    OBJECT_NAME (fk.referenced_object_id) AS ReferenceTableName, 
    COL_NAME(fkc.referenced_object_id, 
    fkc.referenced_column_id) AS ReferenceColumnName, 
    'ALTER TABLE [dbo].['+OBJECT_NAME(fk.parent_object_id)+'] DROP CONSTRAINT ['+fk.name+'];' DropFK, 
    'ALTER TABLE [dbo].['+OBJECT_NAME(fk.parent_object_id)+'] WITH NOCHECK ADD CONSTRAINT ['+fk.name+'] FOREIGN KEY(['+COL_NAME(fkc.referenced_object_id, 
    fkc.referenced_column_id)+'])'+ @l + 
    ' REFERENCES [dbo].['+OBJECT_NAME(fk.referenced_object_id)+'] (['+COL_NAME(fkc.referenced_object_id, 
    fkc.referenced_column_id)+'])'+ @l + 
    ' ON UPDATE CASCADE'+ @l + 
    ' ON DELETE CASCADE;'+ @l + 
    'ALTER TABLE [dbo].['+OBJECT_NAME(fk.parent_object_id)+'] CHECK CONSTRAINT ['+fk.name+'];' CreateFK 
FROM 
    sys.foreign_keys AS fk 
    INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id 
    WHERE OBJECT_NAME(fk.referenced_object_id)[email protected]_object_id 
Các vấn đề liên quan