Script SQL pour trouver des clés étrangères à une table spécifique?

y a-t-il une requête qui me donnera des clés étrangères dirigées vers une colonne de table spécifique? Par exemple, disons que j'avais ces trois tables:

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

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

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

j'ai besoin d'une requête "Select * les Clés Étrangères dirigé au TableA.Id" retourné "Tableau C: TableAId", "Tableau B: TableAId". Je suis en train de parcourir certaines vues du système INFORMATION_SCHEMA, et il semble que je peux facilement voir quelles clés étrangères appartiennent à la Table A, ou la Table B individuellement, mais je ne peux pas trouver où il est dit "La Table C a une clé étrangère pour la Table A" en particulier. Je peux comprendre les détails de la requête, Je ne peux pas trouver les vues que je cherche (ou je les passe sous silence). Toute aide serait appréciée.

16
demandé sur Ocelot20 2011-10-21 21:43:13

2 réponses

gracieuseté de 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
36
répondu Michael Fredrickson 2011-10-21 17:46:01

ajout de dynamic drop et de create ON dbo scheme.

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)=@referenced_object_id
0
répondu Tomer Bar-Shlomo 2013-08-12 20:07:50