我正在从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。我晚上在找合适的地方吗?
答案 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'
答案 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);