给定一个 SourceTable 和一个 TargetTable,我想以编程方式创建一个包含所有所需连接的字符串。
简而言之,我正在尝试找到一种方法来创建这样的字符串:
FROM SourceTable t
JOIN IntermediateTable t1 on t1.keycolumn = t.keycolumn
JOIN TargetTable t2 on t2.keycolumn = t1.keycolumn
我有一个查询,它返回给定表的所有外键,但是在尝试递归地运行所有这些以找到最佳连接路径并制作字符串时遇到了限制。
SELECT
p.name AS ParentTable
,pc.name AS ParentColumn
,r.name AS ChildTable
,rc.name AS ChildColumn
FROM sys.foreign_key_columns fk
JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fk.parent_column_id
JOIN sys.columns rc ON rc.object_id = fk.referenced_object_id AND rc.column_id = fk.referenced_column_id
JOIN sys.tables p ON p.object_id = fk.parent_object_id
JOIN sys.tables r ON r.object_id = fk.referenced_object_id
WHERE fk.parent_object_id = OBJECT_ID('aTable')
ORDER BY ChildTable, fk.referenced_column_id
我确信这已经做过了,但我似乎找不到一个例子。
我有一个脚本可以完成外键遍历的基本版本。我很快对其进行了调整(见下文),您也许可以将其用作起点。
给定一个目标表,脚本尝试为所有可能的源表打印最短路径的连接字符串(或在 tie 的情况下其中一个),以便可以遍历单列外键以到达目标表。该脚本似乎在具有几千个表和许多我尝试过的 FK 连接的数据库上运行良好。
正如其他人在评论中提到的那样,如果您需要处理多列外键,则需要使其更加复杂。另外,请注意,这绝不是生产就绪、经过全面测试的代码。如果您决定构建此功能,希望这是一个有用的起点!
您可以为要连接的所有表放置包含两个字段 TAB_NAME、KEY_NAME 的表的键列表。
例如,对于表
City
同样
Province
和Country
。收集表的数据并放入单个表(例如元数据表)
现在起草如下查询
这将使您了解如何根据匹配的键(相同的键名)链接表
如果您认为键名可能不匹配,您可以包含一个备用键字段并尝试在 where 条件中使用它。