Sql server 查找Sql Server中任意表A和表B之间的关系

Sql server 查找Sql Server中任意表A和表B之间的关系,sql-server,database-design,relational-database,Sql Server,Database Design,Relational Database,假设我们有下面的表,中有相当多的外键 CREATE TABLE Person ( Id int not null --other stuff ) CREATE TABLE Employee ( Id int not null, PersonId int not null, UserId int null --other stuff ) CREATE TABLE User ( Id int not null, Name varcha

假设我们有下面的表,中有相当多的外键

CREATE TABLE Person
(
    Id int not null
    --other stuff
)
CREATE TABLE Employee
(
    Id int not null,
    PersonId int not null,
    UserId int null
    --other stuff
)

CREATE TABLE User
(
    Id int not null,
    Name varchar(25) not null,
    Password varchar(25) not null
    --other stuff
)

CREATE TABLE Roles
(
    Id int not null
    --other stuff
)

CREATE TABLE UserRoles
(
    UserId int not null,
    RoleId int not null
    --other stuff
)

“表X和表Y之间的关系是什么?”

例如,我想“问”:

人员和角色之间的关系是什么

预期答复:

人员1:N员工1:1用户1:N用户角色N:1角色

请注意,表Person和Roles没有直接关系。预期结果应该列出这两个表之间的表

像这样的。图表示可以,但它应该只包含关系中涉及的表

为什么我不能在SSMS中使用“数据库图”。 创建只包含所需表格的相关图表需要花费大量的时间手动查找引用。
我不能使用“添加相关表”,因为添加200多个表会使图表完全不可读


与图表的不同之处在于,我只想输入两个表名。

我相信这可能就是您想要的:

select  t.name as TableWithForeignKey,
        c.name as ForeignKeyColumn,
        t2.name as DependentOnTable,
        c2.name as ReferencedColumn,
        N'N:1'
from    sys.foreign_key_columns as fk
inner join sys.tables as t
on      fk.parent_object_id = t.object_id
inner join sys.columns as c
on      fk.parent_object_id = c.object_id
        and fk.parent_column_id = c.column_id
inner join sys.columns as c2
on      c2.object_id = fk.referenced_object_id
        and c2.column_id = fk.referenced_column_id
inner join sys.tables as t2
on      t2.object_id = c2.object_id
order by TableWithForeignKey
请注意,SQL server中的所有关系都是
1:N
,因为

以下两种情况均无法建立1:1:

也无法建立N:N关系:


如果您想建立这样的关系,那么您只需使用扩展属性为自己写下它,然后“手动”执行它。

我相信这可能就是您想要的:

select  t.name as TableWithForeignKey,
        c.name as ForeignKeyColumn,
        t2.name as DependentOnTable,
        c2.name as ReferencedColumn,
        N'N:1'
from    sys.foreign_key_columns as fk
inner join sys.tables as t
on      fk.parent_object_id = t.object_id
inner join sys.columns as c
on      fk.parent_object_id = c.object_id
        and fk.parent_column_id = c.column_id
inner join sys.columns as c2
on      c2.object_id = fk.referenced_object_id
        and c2.column_id = fk.referenced_column_id
inner join sys.tables as t2
on      t2.object_id = c2.object_id
order by TableWithForeignKey
请注意,SQL server中的所有关系都是
1:N
,因为

以下两种情况均无法建立1:1:

也无法建立N:N关系:


如果要设置此类关系,则只需使用扩展属性为自己写下,然后“手动”执行即可。

如果已安装SSM,则可以扩展数据库并查看(或创建)数据库关系图。然而,这种关系只有在以这种方式设置时才会显示。可能您的图表是空的。正如我在问题中所写,SSMS数据库图表不能用于我的案例。但是我已经准备好了所有外键,因为你似乎不能使用数据库图表,你肯定不会得到你想要的“图表”。使用SSMS,您只需发送一个查询并以一个或多个表的形式获取(作为回报)答案。因此,您需要重写您的问题并解释“您希望如何查看表中两个表之间的关系”。如果您安装了SSM,您可以扩展数据库并查看(或创建)数据库关系图。然而,这种关系只有在以这种方式设置时才会显示。可能您的图表是空的。正如我在问题中所写,SSMS数据库图表不能用于我的案例。但是我已经准备好了所有外键,因为你似乎不能使用数据库图表,你肯定不会得到你想要的“图表”。使用SSMS,您只需发送一个查询并以一个或多个表的形式获取(作为回报)答案。因此,您需要重写您的问题并解释“您希望如何查看表中两个表之间的关系”。感谢您提供有关关系的提示。至于代码,您建议如何使用它来获得预期的答案?如何使用此查询获取从属表链?这取决于您的口味。上表提供了所有参考资料。在表格中创建一个具有视觉吸引力的“链”并不容易。但“父子层次结构”的例子很多,包括它们的路径。只需将上述结果转储到一个表变量中,然后使用以下任意一种方法将其扩展到您的口味:或或谷歌以获取更多信息。谢谢Ralph,如果我找不到其他方法,我将用SQL编写一些内容。感谢您提供有关关系的提示。至于代码,您建议如何使用它来获得预期的答案?如何使用此查询获取从属表链?这取决于您的口味。上表提供了所有参考资料。在表格中创建一个具有视觉吸引力的“链”并不容易。但“父子层次结构”的例子很多,包括它们的路径。只需将上述结果转储到一个表变量中,然后使用以下任意一种方式将其扩展到您喜欢的范围:或谷歌获取更多信息。谢谢Ralph,如果找不到其他方法,我将用SQL编写一些内容。