データベース内のすべてのテーブル間の主キー(外部キーの関係)を見つけるためのクエリを作成しました。これは、外部キーが物理的に存在する場合にのみ機能します。
このクエリを実行して、私の問題を明確に理解してください。
WITH cte
AS
(
SELECT
fk.create_date
, fk.modify_date
, fkc.constraint_object_id AS ConstraintId
, OBJECT_NAME(fkc.constraint_object_id) AS ConstraintName
--, fkc.referenced_object_id AS PrimaryKeyTableId
, OBJECT_NAME(fkc.referenced_object_id) AS PrimaryKeyTableName
--, fkc.referenced_column_id AS PrimaryKeyColumnId
, rc.name AS PrimaryKeyColumnName
--, fk.parent_object_id AS ForeignKeyTableId
, OBJECT_NAME(fk.parent_object_id) AS ForeignKeyTableName
--, fkc.parent_column_id AS ForeignKeyColumnId
, lc.name AS ForeignKeyColumnName
FROM sys.foreign_key_columns fkc
INNER JOIN sys.columns rc
ON rc.OBJECT_ID = fkc.referenced_object_id
AND fkc.referenced_column_id = rc.column_id
INNER JOIN sys.foreign_keys fk
ON fk.OBJECT_ID = fkc.constraint_object_id
INNER JOIN sys.columns lc
ON lc.OBJECT_ID = fk.parent_object_id
AND fkc.parent_column_id = lc.column_id
)
, cte2(create_date, modify_date, ConstraintName
, PrimaryKeyTableName, PrimaryKeyColumnName
, ForeignKeyTableName, ForeignKeyColumnName
, Hops, path ) AS
(
SELECT
create_date, modify_date, ConstraintName
, PrimaryKeyTableName, PrimaryKeyColumnName
, ForeignKeyTableName, ForeignKeyColumnName
, 1 , CAST(QUOTENAME(PrimaryKeyTableName + '.' + PrimaryKeyColumnName) AS VARCHAR(4000))
FROM cte
UNION ALL
SELECT
cte.create_date, cte.modify_date, cte.ConstraintName
, cte.PrimaryKeyTableName, cte.PrimaryKeyColumnName
, cte.ForeignKeyTableName, cte.ForeignKeyColumnName
, cte2.Hops +1, CAST(cte2.path + '-> ' +QUOTENAME(cte.PrimaryKeyTableName+ '.' + cte.PrimaryKeyColumnName) AS VARCHAR(4000))
FROM cte2 INNER JOIN cte ON cte2.ForeignKeyTableName = cte.PrimaryKeyTableName
AND cte2.ForeignKeyColumnName != cte.PrimaryKeyColumnName
)
SELECT
ConstraintName
, PrimaryKeyTableName, PrimaryKeyColumnName
, ForeignKeyTableName, ForeignKeyColumnName
, Hops, path + '-> ' + QUOTENAME(ForeignKeyTableName + '.' + ForeignKeyColumnName) AS Path
FROM cte2
データベースに複合主キーが存在しない限り、上記のクエリはスムーズに機能します。
私がテーブルを持っているとしましょう
- Method(MethodId、....)
- Parameter(ParameterId、...)
- ParameterMethodMap(ParameterId、MethodId)-複合主キー
- Test(TestId、ParameterId、MethodId ....)-外部キーとして使用されている複合主キー
- Sample(SampleId、TestId ....)
したがって、現在のクエリは、複合主キーのシナリオを考慮してパスを生成しません。
のようなパスを生成したい。
[Method.MethodId]-> [ParameterMethodMap.MethodId、ParameterMethodMap.ParameterId] -> [Test.TestId]-> [Sample.SampleId]
これはどういうわけか私は複合主キーをマージすることを考えています。これどうやってするの?