0

テーブル内のすべての外部キーを検索し、各外部キーについて、それが指す主キー テーブルと列を検索します。これをすべての DB ベンダー (または少なくとも INFORMATION_SCHEMA を適切に実装しているすべて) に対して使用したいので、INFORMATION_SCHEMA を使用してこれを行う必要があります。

私が思いついた最高のものは次のとおりです。

"SELECT k.COLUMN_NAME, ccu.TABLE_NAME AS 'references_table', ccu.COLUMN_NAME AS 'references_field' " +
"FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS k LEFT OUTER JOIN " +
"INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS c ON k.TABLE_NAME = c.TABLE_NAME AND k.TABLE_SCHEMA = c.TABLE_SCHEMA AND " +
"k.TABLE_CATALOG = c.TABLE_CATALOG AND k.CONSTRAINT_CATALOG = c.CONSTRAINT_CATALOG AND " +
"k.CONSTRAINT_NAME = c.CONSTRAINT_NAME LEFT OUTER JOIN " +
"INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS rc ON rc.CONSTRAINT_SCHEMA = c.CONSTRAINT_SCHEMA AND " +
"rc.CONSTRAINT_CATALOG = c.CONSTRAINT_CATALOG AND rc.CONSTRAINT_NAME = c.CONSTRAINT_NAME LEFT OUTER JOIN " +
"INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu ON rc.UNIQUE_CONSTRAINT_SCHEMA = ccu.CONSTRAINT_SCHEMA AND " +
"rc.UNIQUE_CONSTRAINT_CATALOG = ccu.CONSTRAINT_CATALOG AND rc.UNIQUE_CONSTRAINT_NAME = ccu.CONSTRAINT_NAME " +
"WHERE(k.CONSTRAINT_CATALOG = DB_NAME()) AND (k.TABLE_NAME = '" + table.Name + "') AND (c.CONSTRAINT_TYPE = 'FOREIGN KEY')";

これは複雑すぎると思います。これにはより良い選択がありますか?

ありがとう - デイブ

4

3 に答える 3

2
SELECT  ccu1.TABLE_NAME as fkTable, ccu1.COLUMN_NAME as fkColumn, 
        ccu2.TABLE_NAME as referencedTable, ccu2.COLUMN_NAME as referencedColumn
FROM    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu1,
        INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu2,
        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
WHERE   rc.CONSTRAINT_NAME = ccu1.CONSTRAINT_NAME
AND     rc.UNIQUE_CONSTRAINT_NAME = ccu2.CONSTRAINT_NAME

これを SQL Server 2008 データベースに対してテストしたところ、ユーザー データベースのコンテキストで実行すると、定義済みのすべてのテーブルと外部キー、および関連するテーブルと列が返されました。

もちろん、これをさらにフィルタリングすることもできます。

于 2012-06-30T02:49:53.543 に答える
2

最初に受け入れられた回答は、複合主キーを使用するデータベースを適切に考慮していません。

代わりにこれを試してください:

select  fku.CONSTRAINT_NAME, fku.ORDINAL_POSITION
        , fku.TABLE_SCHEMA as FK_TABLE_SCHEMA
        , fku.TABLE_NAME as FK_TABLE_NAME
        , fku.COLUMN_NAME as FK_COLUMN_NAME
        , pku.TABLE_SCHEMA as PK_TABLE_SCHEMA
        , pku.TABLE_NAME as PK_TABLE_NAME
        , pku.COLUMN_NAME as PK_COLUMN_NAME

from    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE pku
            ON rc.UNIQUE_CONSTRAINT_NAME = pku.CONSTRAINT_NAME
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE fku
            ON rc.CONSTRAINT_NAME = fku.CONSTRAINT_NAME AND pku.ORDINAL_POSITION = fku.ORDINAL_POSITION
order by fku.TABLE_SCHEMA, fku.TABLE_NAME, fku.ORDINAL_POSITION
于 2014-04-03T21:55:00.833 に答える
0

UNIQUE_CONSTRAINT_NAME列を使用しているため、参照されるテーブル(外部キーが対象としているテーブル)に一意のキーがある場合、Jimの回答はすべての外部キーを正しく返すことができません。私は使用することをお勧めします:

SELECT 
    FK = fk.name, 
    FKTable = QUOTENAME(OBJECT_SCHEMA_NAME(fkcol.[object_id])) 
        + '.' + QUOTENAME(OBJECT_NAME(fkcol.[object_id])),
    FKCol = fkcol.name,
    ' references => ',
    PKTable = QUOTENAME(OBJECT_SCHEMA_NAME(pkcol.[object_id])) 
        + '.' + QUOTENAME(OBJECT_NAME(pkcol.[object_id])),
    PKCol = pkcol.name
FROM sys.foreign_keys AS fk
INNER JOIN sys.foreign_key_columns AS fkc
ON fk.[object_id] = fkc.constraint_object_id
INNER JOIN sys.columns AS fkcol
ON fkc.parent_object_id = fkcol.[object_id]
AND fkc.parent_column_id = fkcol.column_id
INNER JOIN sys.columns AS pkcol
ON fkc.referenced_object_id = pkcol.[object_id]
AND fkc.referenced_column_id = pkcol.column_id
ORDER BY fkc.constraint_column_id;

ソース:

于 2013-01-11T16:43:31.813 に答える