用触发器替换视图

时间:2011-01-17 17:03:57

标签: sql triggers indexed-view

我有一个视图,我希望创建一个失败的索引,因为我需要索引一个计算列(这失败,错误代码为2729“......不能用于索引或统计信息或作为分区键,因为它是非确定性的。我希望能够用一个触发器或一组触发器替换视图,这将触发索引表。视图非常简单。

给出一张表:

CREATE TABLE SourceData (
  ItemId int NOT NULL,
  KeyId int NOT NULL,
  Value varchar(MAX) NULL
)

我创建了视图:

CREATE VIEW DateView WITH SCHEMABINDING
AS
SELECT CONVERT(DATETIME, Value) As KeyDate,
ItemId FROM dbo.SourceData WHERE KeyId=123

然后我尝试在视图上创建索引:

CREATE NONCLUSTERED INDEX IX_DateView ON dbo.DateView (
  [KeyDate] ASC
)
INCLUDE ( [ItemId]) 

失败了。

之前我没有真正使用过触发器,但我知道我应该能够使用它们来检测和过滤对底层SourceData表的任何更改并将它们应用到新表来替换DateView

1 个答案:

答案 0 :(得分:1)

您可以将KeyDate实现为真实日期时间列,并使用触发器(插入和更新时)维护它

将列添加为实际日期时间

alter table SourceData add KeyDate datetime

创建一个触发器来维护它

create trigger CRU_SourceData
on SourceData
after insert, update
as
begin
if update(Value)
    update SourceData
    set KeyDate = Convert(datetime,inserted.Value)
    from inserted
    -- assuming itemID uniquely identifies the record
    where inserted.ItemId=SourceData.ItemID
end

创建视图

CREATE VIEW DateView WITH SCHEMABINDING
AS
SELECT KeyDate, ItemId FROM dbo.SourceData
WHERE KeyId=123

现在这将有效

CREATE NONCLUSTERED INDEX IX_DateView ON dbo.DateView (
  [KeyDate] ASC
)
INCLUDE ( [ItemId])