可视化表之间的关系

时间:2013-10-08 14:30:57

标签: sql sql-server tsql

我正在努力完成以下任务:

我有几个表,其中一些表包含来自其他表的主键 我试着准备一个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

2 个答案:

答案 0 :(得分:1)

你应该考虑一种递归方法。基本上编写一个存储过程,它解决了一个级别的直接依赖关系(即表中的外键和表中的外键)。然后,一旦得到结果,再次调用每个结果。重复,直到构建完整的层次结构。

可以通过sys.foreign_key_columnssys.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