Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从MSSQL数据库中检索关系_Sql_Sql Server_Relationship_Sql Server 2016 - Fatal编程技术网

如何从MSSQL数据库中检索关系

如何从MSSQL数据库中检索关系,sql,sql-server,relationship,sql-server-2016,Sql,Sql Server,Relationship,Sql Server 2016,我正在从我的MS-SQL 2016数据库获取数据。要确定输入字段的类型,我需要知道是否为检索到的任何列设置了任何关系。我需要这些信息在输入字段和下拉菜单之间切换 我已经在microsofts文档()中查找过了,但是找不到任何包含我需要的信息的sys表。我看对地方了吗?使用以下两个查询。替换@schemaName、@tableName和@columnName,如代码段开头所示 DECLARE @schemaName AS SYSNAME= 'put here your schema name';

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


我已经在microsofts文档()中查找过了,但是找不到任何包含我需要的信息的sys表。我看对地方了吗?

使用以下两个查询。替换@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);

使用以下两个查询。替换@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);
这可能会有所帮助

;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' 
这可能会有所帮助

;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' 

可以查询
sys.foreign_key
sys.foreign_key_列
目录视图来确定表之间的外键关系。可以查询
sys.foreign_key
sys.foreign_key_列
目录视图来确定表之间的外键关系。为什么要将其作为CTE来执行?您知道了吗只能使用内部查询,但CTE将帮助使用WHERE子句。查看最后两行(注释)。不仅CTE,子查询也同样有用。是的。CTE只是语法,所以理论上它只是一个子查询。CTE与子查询的语法不同。不同的语法可能会导致MS SQL引擎运行相同的优化查询。更重要的是哪个更容易阅读,或者哪个最能代表你的意图。这是主观的,但我建议您的表表达式没有什么共同之处,因为您只使用了一次。为什么要将其作为CTE?您只能使用内部查询,但CTE将有助于使用WHERE子句。查看最后两行(注释)。不仅CTE,子查询也同样有用。是的。CTE只是语法,所以理论上它只是一个子查询。CTE与子查询的语法不同。不同的语法可能会导致MS SQL引擎运行相同的优化查询。更重要的是哪个更容易阅读,或者哪个最能代表你的意图。这是主观的,但是,我建议您的表表达式没有什么共同之处,因为您只使用了一次。