SQL 2000:テーブルの外部キー関係を取得するT-SQL
-
06-07-2019 - |
質問
類似しているが同一ではない 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