質問

類似しているが同一ではない SQL Server 2000-クエリaテーブルの外部キー関係

テーブル名を指定すると、そのテーブルの外部キー関係を返すSQL 2000で動作するT-SQLステートメントが必要です。例:

Table MyFristTableにはMySecondTableへの外部キーがあります。MyFirstTable.ColAはMySecondTable.ColBにある必要があります。 sqlステートメント(またはストアドプロシージャ)がMyFirstTableに対して実行され、次の行に結果セットが返された場合、私は喜んでいるでしょう

Column | FK_Table      | FK_COLUMN
----------------------------------
ColA   | MySecondTable | ColB

NB :sys.foreign_key_columnsに依存しているため機能しないSQL 2005のサンプルがあります

sp_helpステートメントの結果を解析する必要はありません。

ありがとう、

役に立ちましたか?

解決

DECLARE @tableName sysname

SET @tableName = '' -- Your table name goes here

SELECT
    c.name
    , target.name
    , targetc.name
FROM
    -- source table
    sysobjects t
    -- source column
    INNER JOIN syscolumns c ON t.id = c.id
    -- general constraint
    INNER JOIN sysconstraints co ON t.id = co.id AND co.colid = c.colid
    -- foreign key constraint
    INNER JOIN sysforeignkeys fk ON co.constid = fk.constid
    -- target table
    INNER JOIN sysobjects target ON fk.rkeyid = target.id
    -- target column
    INNER JOIN syscolumns targetc ON fk.rkey = targetc.colid AND fk.rkeyid = targetc.id
WHERE
    t.name = @tableName

SQL 2000で利用可能なシステムビュー(つまり、SQL 2005 sys.XXXでなくsysXXXのもの)のみを使用したと思いますが、実際にSQL 2005でテストしただけです。環境。

他のヒント

クエリに対してこの正確な処理を行う必要があり、sysテーブルのようなバージョンを試した後、このストアドプロシージャを見つけました。

exec sp_fkeys @fktable_name = 'foo'

SQL Serverで利用できるようです2000 。 また、いくつかのケースで、このストアドプロシージャとクエリの間にわずかな違いがあることがわかりました。 sp_fkeysが正規バージョンだと思います。

このようなものが必要だったので、システムストアドプロシージャのソースコードを見て、必要なものを自分のプロシージャにコピーして、必要に応じて機能させました。

sp_helpconstraintのソースコードを見ることができます...

私はグーグルでこれを見つけました...ので、この作品が私のメリットではない場合。役に立てば幸いです

 SELECT 
        FK_Table  = FK.TABLE_NAME, 
        FK_Column = CU.COLUMN_NAME, 
        PK_Table  = PK.TABLE_NAME, 
        PK_Column = PT.COLUMN_NAME, 
        Constraint_Name = C.CONSTRAINT_NAME 
    FROM 
        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
        INNER JOIN 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
            ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
        INNER JOIN 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
            ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
        INNER JOIN 
        INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
            ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
        INNER JOIN 
        ( 
            SELECT 
                i1.TABLE_NAME, i2.COLUMN_NAME 
            FROM 
                INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
                INNER JOIN 
                INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
                ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
                WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
        ) PT 
        ON PT.TABLE_NAME = PK.TABLE_NAME 

    WHERE PK.TABLE_NAME='something'    -- the table for you are asking
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top