我正在努力完成以下任务:
我有几个表,其中一些表包含来自其他表的主键
我试着准备一个SQLFiddle来澄清,你可以在这里找到http://sqlfiddle.com/#!3/38ea2/1
+-----------+ +-----------+-----------+ +-----------+-----------+ +-----------+-----------+
| tblA | | tblB | | tblC | | tblD |
+-----------+ +-----------+-----------+ +-----------+-----------+ +-----------+-----------+
| ID_A | | ID_B | ID_A | | ID_C | ID_B | | ID_D | ID_C |
+-----------+ +-----------+-----------+ +-----------+-----------+ +-----------+-----------+
| 1 | | 2 | 1 | | 3 | 2 | | 4 | 3 |
+-----------+ +-----------+-----------+ +-----------+-----------+ +-----------+-----------+
我的目标是创建一个过程,它返回表之间的所有可用关系,并在最后可视化(使用VB.NET)。
我想要想象的方式是这样的:
ID_A(1)
ID_B(2)
ID_C(3)<-- current
ID_D(4)
此列表中的所有项目都是超链接的,并指向带有各自“日志”的网站,即如果您点击ID_B,则会打印出来:
ID_A(1)
ID_B(2)<-- current
ID_C(3)
ID_D(4)
(我希望你们现在知道我来自哪里,因为我在描述我的问题时有点挣扎。)
我认为我需要一个带有(至少)2个参数的过程/函数,@iID
和@sFieldName
。
因此,呼叫GetRelationships(3, 'ID_C')
应该返回2 (ID_B), 1 (ID_A)
和4 (ID_D)
,因为这是他们的连接方式。
我认为一个好的开始方式是收集哪些表(和他们的PKs
)连接并将它们存储在一个临时表中,我仍在玩这个并且当我得到一些有用的东西时将编辑开头的帖子。
我真的很感激一些提示或想法。
。我正在使用SQL Server 2005
答案 0 :(得分:1)
你应该考虑一种递归方法。基本上编写一个存储过程,它解决了一个级别的直接依赖关系(即表中的外键和表中的外键)。然后,一旦得到结果,再次调用每个结果。重复,直到构建完整的层次结构。
可以通过sys.foreign_key_columns
和sys.objects
表在SQL Server中查询外部关系。
另请查看此问题:How can I list all foreign keys referencing a given table in SQL Server?
答案 1 :(得分:1)
DECLARE @TableName NVARCHAR(1000)= 'TableName'
DECLARE @ColumnName NVARCHAR(1000)= 'ColumnName'
SELECT f.name AS ForeignKey,
SCHEMA_NAME(f.SCHEMA_ID) SchemaName,
OBJECT_NAME(f.parent_object_id) AS TableName,
COL_NAME(fc.parent_object_id,fc.parent_column_id) AS ColumnName,
SCHEMA_NAME(o.SCHEMA_ID) ReferenceSchemaName,
OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
COL_NAME(fc.referenced_object_id,fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
INNER JOIN sys.objects AS o ON o.OBJECT_ID = fc.referenced_object_id
WHERE OBJECT_NAME(f.parent_object_id) = @TableName AND COL_NAME(fc.parent_object_id,fc.parent_column_id) = @ColumnName
GO