【发布时间】:2015-06-11 08:00:04
【问题描述】:
我正在尝试将 sys.columns 中的记录加入一个视图,加入 sys.columns 中它所引用的表的记录,因为我需要这些值视图中选定列的 is_nullable、is_computed 和 default_object_id 列。
视图的 sys.columns 记录具有“不正确”的值,您可以通过运行以下示例查询来观察:
CREATE TABLE TestTable (
FieldA int NOT NULL,
FieldB int DEFAULT (1),
FieldC as CONVERT(INT, FieldA + FieldB),
FieldD int NOT NULL
)
GO
CREATE VIEW TestView WITH SCHEMABINDING AS
SELECT FieldA, FieldC as TestC, FieldB + FieldC as TestD
FROM dbo.TestTable WHERE FieldD = 1
GO
SELECT OBJECT_NAME(c.object_id) as ViewName, c.name as ColumnName,
c.is_nullable as Nullable, c.is_computed as Computed,
cast(CASE WHEN c.default_object_id > 0 THEN 1 ELSE 0 END as bit) as HasDefault
FROM sys.columns c
WHERE object_id = OBJECT_ID('TestTable')
GO
SELECT OBJECT_NAME(c.object_id) as ViewName, c.name as ColumnName,
c.is_nullable as Nullable, c.is_computed as Computed,
cast(CASE WHEN c.default_object_id > 0 THEN 1 ELSE 0 END as bit) as HasDefault
FROM sys.columns c
WHERE object_id = OBJECT_ID('TestView')
GO
我曾尝试使用系统视图来连接依赖项,但它们没有提供关于视图中的哪一列引用表中的哪一列的信息:
-- dm_sql_referenced_entities gives us all columns referenced, but all records
-- have referencing_minor_id 0, so we do not know which column refers to what
SELECT * FROM sys.dm_sql_referenced_entities('dbo.TestView', 'OBJECT')
GO
-- sql_dependencies gives us all columns referenced, but all records has
-- column_id 0 so we can not use this either of joining the columns
SELECT * FROM sys.sql_dependencies WHERE object_id = OBJECT_ID('TestView')
GO
-- sql_expression_dependencies just tells us what table we are referencing
-- if view is not created WITH SCHEMABINDING. If it is, it will return columns,
-- but with referencing_minor_id 0 for all records, so not able use this either
SELECT * FROM sys.sql_expression_dependencies
WHERE referencing_id = OBJECT_ID('TestView')
GO
某人在 social.msdn 上提交的这个未答复的帖子似乎是同一个问题: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/4ae5869f-bf64-4eef-a952-9ac40c932cd4
【问题讨论】:
-
我在研究时也发现了这个帖子,但是如果您在视图中选择了多个表或列的数量或顺序不匹配,则该解决方案不起作用:stackoverflow.com/a/10054481/1463929
-
查询视图列的可空性和默认结果似乎是正确的。我能看到的唯一可能的分歧是是否计算了列。但是,从某种意义上说,视图的每一列都是“计算的”。
-
我不是在争论 quires 的结果是否正确,但我需要知道 TestView TestC 指的是计算列,如果说 TestD 只指 FieldB,我会需要知道它引用的列有一个默认值。
-
您可以理解,当您的第二段开始“视图的 sys.columns 记录具有“不正确”的值”时,我可能已经得到了这样的印象
-
对,“不是想要的值”。我只关心表的值。实际用例是我想采用 is_nullable、is_computed 和 default_object_id,并确定在插入新记录时是否需要该列。在渲染客户端时,我们将包含一个“必需”位,以便能够在将实际插入命令发送到服务器之前检查客户端是否需要字段。
标签: sql-server tsql