【问题标题】:How to determine if a column of a view is derived or constant?如何确定视图的列是派生的还是常量?
【发布时间】:2013-02-21 09:51:05
【问题描述】:

假设我有下表:

create table t_Item (
    ItemID int not null identity(1,1) constraint PK_Item primary key,
    Description varchar(256) not null,
    Price decimal(10,2) not null
)

还有以下观点:

create view Item as
  select ItemID
        ,Description
        ,Price
        ,1.09 Tax
        ,Price * 1.09 TaxedPrice
    from t_Item

TaxedPrice 是派生列,Tax 是常量列。

因此,我无法插入或更新其中任何一个。以下第一个查询将通过,而其他查询将失败并出现错误。

insert into Item (Description, Price) values ('Test item', 14.00)

insert into Item (Description, Price, TaxedPrice) values ('Test item', 14.00, 15.26)

insert into Item (Description, Price, Tax) values ('Test item', 14.00, 1.09)

这里是返回的错误信息:

视图或函数“Item”的更新或插入失败,因为它包含派生或常量字段。

有没有办法(可能是系统视图)列出不能更新的视图列?

【问题讨论】:

  • 不知道。我原以为sys.columns 中的is_computed 会显示这一点,但似乎没有意见,我也没有在COLUMNPROPERTY 中看到任何内容。
  • is_computed 也是我的第一个猜测,但Microsoft's definition 是:A computed column is computed from an expression that can use other columns in the same table. 情况并非如此,因为视图的列使用基础表中的列,而不是来自查看自己。

标签: sql-server view system-views


【解决方案1】:

看起来没有系统视图保存您正在寻找的信息。可以通过解析视图定义或者通过异常处理找到派生列或者常量列...不好,但是没找到其他方法...

【讨论】:

  • 我很害怕……您是否找到了一种从视图定义中提取派生列列表的快速方法?这看起来是一个复杂的问题:例如,两个selects 之间的union 将标记所有派生的列,但会在查询中间找到。
【解决方案2】:
  1. 任何列都来自以下聚合函数,被视为派生列。平均值、计数、总和、最小值、最大值、分组、STDEV、STDEVP、VAR、VARP
  2. 如果视图定义包含以下语法,则所有列都被视为派生列。 UNION,UNION ALL,CROSSJOIN,除了,INTERSECT
  3. 受 GROUP BY、HAVING、DISTINCT 影响的列也被视为派生列。

我不认为这涵盖了所有场景,而是编写解析器的起点。

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    相关资源
    最近更新 更多