2017-03-03 2 views
1

Wie kann ich alle Einschränkungen aus dem DB bekommen, wo ein Feld auf ein anderes Feld in der gleichen Tabelle verwiesen wird?Wie erhalten FKs zwischen verschiedenen Feldern in einer Tabelle?

Diese Art der Referenz kann die Leistung stark beeinträchtigen, daher möchte ich alle diese Referenzen in meiner Datenbank finden und analysieren.

Beispiel der Tabellenstruktur:

CREATE TABLE MyTable(id uniqueidentifier NOT NULL PRIMARY KEY, ReferentID uniqueidentifier) 

ALTER TABLE [dbo].MyTable WITH CHECK ADD CONSTRAINT [TEST_FK] FOREIGN KEY([ReferentID]) 
REFERENCES [dbo].MyTable ([Id]) 
GO 

ALTER TABLE [dbo].MyTable CHECK CONSTRAINT [TEST_FK] 
GO 

Antwort

1

aus der Abfrage Ab this Antwort Sie können einen Filter hinzufügen, um nur FKs zu erhalten in der gleichen Tabelle.

Die resultierende Abfrage sollte wie folgt aussehen:

SELECT 
    KCU1.CONSTRAINT_NAME AS FK_CONSTRAINT_NAME 
    ,KCU1.TABLE_NAME AS FK_TABLE_NAME -- 
    ,KCU1.COLUMN_NAME AS FK_COLUMN_NAME 
    ,KCU1.ORDINAL_POSITION AS FK_ORDINAL_POSITION 
    ,KCU2.CONSTRAINT_NAME AS REFERENCED_CONSTRAINT_NAME 
    ,KCU2.TABLE_NAME AS REFERENCED_TABLE_NAME -- 
    ,KCU2.COLUMN_NAME AS REFERENCED_COLUMN_NAME 
    ,KCU2.ORDINAL_POSITION AS REFERENCED_ORDINAL_POSITION 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC 

INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU1 
    ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG 
    AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA 
    AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME 

INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU2 
    ON KCU2.CONSTRAINT_CATALOG = RC.UNIQUE_CONSTRAINT_CATALOG 
    AND KCU2.CONSTRAINT_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA 
    AND KCU2.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME 
    AND KCU2.ORDINAL_POSITION = KCU1.ORDINAL_POSITION 

WHERE KCU1.TABLE_NAME=KCU2.TABLE_NAME 
+0

Es Arbeiten auf meinen Test-Tabellen. Vielen Dank! – Frank59

1

Sie können alle foreign keys bekommen von diesem procedure

EXEC sp_fkeys 'MyTable'; 

oder Sie verwenden können:

select * from sysobjects where xtype='F'; 
Verwandte Themen