从 SQL 服务器中查找 table 关系

Find table relations from SQL Server

我想知道如何通过 运行 宁 SQL 查询来发现我的 SQL 服务器数据库中哪些表彼此相关。

例如,假设我有 2 个多对多关系和 3 个用一些随机值初始化的表。

create table A (pk int not null primary key identity, A int);
create table B (pk int not null primary key identity, B int);
create table C (pk int not null primary key identity, C int);

create table AB 
(
    a_pk int not null references A,
    b_pk int not null references B,
    primary key(a_pk, b_pk)
);

create table AC 
(
    a_pk int not null references A,
    c_pk int not null references C,
    primary key(a_pk, c_pk)
);

我想要 运行 一个参数化查询,其输出类似于:

带参数'A':

MM_TAB  |  REL_TAB
------------------
  AB    |    B 
  AC    |    C

带参数'B':

MM_TAB  |  REL_TAB
------------------
  AB    |    A

带参数'C':

MM_TAB  |  REL_TAB
------------------
  AC    |    A  

我该怎么做?

看看这个:

我使用 SQL Server 2014 创建了表和关系:

create database relation

use relation

create table A (pk int not null primary key identity, A int);
create table B (pk int not null primary key identity, B int);
create table C (pk int not null primary key identity, C int);

create table AB 
(
    a_pk int not null  foreign key references A(pk),
    b_pk int not null foreign key references B(pk),
    primary key(a_pk, b_pk)
);

create table AC 
(
    a_pk int not null  foreign key references A(pk),
    c_pk int not null foreign key references C(pk),
    primary key(a_pk, c_pk)
);

然后您可以使用此查询来查找相关表:

    use relation 
go

DECLARE @table_param NVARCHAR(2)='A';

with rel as(
        SELECT 
            K_Table = FK.TABLE_NAME,
            --FK_Column = CU.COLUMN_NAME,
            PK_Table = PK.TABLE_NAME
            --PK_Column = PT.COLUMN_NAME,
            --Constraint_Name = C.CONSTRAINT_NAME
        FROM 
            INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
        INNER JOIN 
            INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
        INNER JOIN 
            INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
        INNER JOIN 
            INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
        wHERE PK.TABLE_NAME = @table_param

)

SELECT 
    K_Table = FK.TABLE_NAME,
    --FK_Column = CU.COLUMN_NAME,
    PK_Table = PK.TABLE_NAME
    --PK_Column = PT.COLUMN_NAME,
    --Constraint_Name = C.CONSTRAINT_NAME
FROM 
    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
WHERE FK.TABLE_NAME IN(SELECT R.K_Table FROM REL R)