如何从MSSQL数据库检索关系

时间:2019-07-18 09:52:15

标签: sql sql-server relationship sql-server-2016

我正在从MS-SQL 2016数据库中获取数据。为了确定输入字段的类型,我需要知道是否为我检索到的任何列设置了任何关系。我需要此信息在输入字段和下拉菜单之间切换。

我已经查看了Microsoft文档(https://docs.microsoft.com/de-de/sql/relational-databases/system-catalog-views/sys-sql-dependencies-transact-sql?view=sql-server-2017),但是找不到包含我所需信息的任何sys-table。我晚上在找合适的地方吗?

2 个答案:

答案 0 :(得分:1)

这可能有帮助。

;WITH Relationship
AS(
SELECT
    ROW_NUMBER() OVER(ORDER BY fk.name) as Id,
    CAST(fk.name as NVARCHAR(250)) as RelationName,
    CAST(tr.name as NVARCHAR(250)) as ParentTable,
    CAST((tr.name+'.'+cr.name) as NVARCHAR(250)) as ParentColumn,
    CAST(tp.name as NVARCHAR(250)) as ReferencedTable,
    CAST((tp.name+'.'+cp.name) as NVARCHAR(250)) as ReferencedColumn

FROM 
    sys.foreign_keys fk
INNER JOIN 
    sys.tables tp ON fk.parent_object_id = tp.object_id
INNER JOIN 
    sys.tables tr ON fk.referenced_object_id = tr.object_id
INNER JOIN 
    sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN 
    sys.columns cp ON fkc.parent_column_id = cp.column_id AND fkc.parent_object_id = cp.object_id
INNER JOIN 
    sys.columns cr ON fkc.referenced_column_id = cr.column_id AND fkc.referenced_object_id = cr.object_id
--ORDER BY
--    tp.name, cp.column_id
)
SELECT * FROM Relationship
--Where  ParentTable = 'Product' AND
--ReferencedTable='BillOfMaterials' 

enter image description here

答案 1 :(得分:0)

使用以下两个查询。如代码段开头所示,替换@ schemaName,@ tableName和@columnName。

DECLARE @schemaName AS SYSNAME= 'put here your schema name';
DECLARE @tableName AS SYSNAME= 'put here your table name';
DECLARE @columnName AS SYSNAME= 'put here your column name';
--The first one
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 SCHEMA_NAME(o.SCHEMA_ID) = @schemaName
      AND OBJECT_NAME(f.referenced_object_id) = @tableName
      AND COL_NAME(fc.parent_object_id, fc.parent_column_id) = @columnName
ORDER BY SCHEMA_NAME(f.SCHEMA_ID);
--The second one
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 SCHEMA_NAME(F.SCHEMA_ID) = @schemaName
      AND COL_NAME(fc.parent_object_id, fc.parent_column_id) = @columnName
ORDER BY SCHEMA_NAME(O.SCHEMA_ID), 
         OBJECT_NAME(f.referenced_object_id);
相关问题