如何从MSSQL数据库中检索关系
我正在从我的MS-SQL 2016数据库获取数据。要确定输入字段的类型,我需要知道是否为检索到的任何列设置了任何关系。我需要这些信息在输入字段和下拉菜单之间切换如何从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';
我已经在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引擎运行相同的优化查询。更重要的是哪个更容易阅读,或者哪个最能代表你的意图。这是主观的,但是,我建议您的表表达式没有什么共同之处,因为您只使用了一次。