9

假设我有下表:

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)

这是返回的错误消息:

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

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

4

2 回答 2

2

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

于 2013-03-06T20:41:30.993 回答
1
  1. 任何列都来自以下聚合函数,被视为派生列。平均值、计数、总和、最小值、最大值、分组、STDEV、STDEVP、VAR、VARP
  2. 如果视图定义包含以下语法,则所有列都被视为派生列。UNION、UNION ALL、CROSSJOIN、除了、INTERSECT
  3. 受 GROUP BY、HAVING、DISTINCT 影响的列也被视为派生列。

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

于 2013-03-07T19:16:26.270 回答