2011-10-21 19 views
16

Czy istnieje zapytanie, które dostarczy mi klucze obce skierowane do konkretnej kolumny tabeli? Na przykład, powiedzmy miałem te trzy tabele:Skrypt SQL, aby znaleźć klucze obce do określonej tabeli?

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

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

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

muszę zapytać wzdłuż linii „select * Klucze obce skierowane TableA.Id”, który wrócił „Tabela C: TableAId”, „Tabela B: TableAId ". Przeglądam niektóre widoki systemowe INFORMATION_SCHEMA i wydaje mi się, że mogę łatwo zobaczyć, które klucze obce należą do tabeli A lub pojedynczej tabeli B, ale nie mogę znaleźć miejsca, w którym jest napisane "Tabela C ma klucz obcy do Tabela A "w szczególności. Mogę zrozumieć specyfikę zapytania, po prostu nie mogę znaleźć poglądów, których szukam (lub ich glosuję). Każda pomoc będzie doceniona.

Odpowiedz

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

Dzięki! To wystarczy. – Ocelot20

+0

Dude - to jest niesamowite! Szukałem "sprzężenia generatora", ale jest to ręczne sql dla niego. Nie mogłem znaleźć tego narzędzia online (z SQL Server) - może napiszę własne! – SlimsGhost

0

Dodany dynamiczny spadek i tworzyć na schemacie 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 
Powiązane problemy