0

我有一个视图,我希望创建一个失败的索引,因为我需要索引一个计算列(这会失败,错误代码为 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

4

1 回答 1

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]) 
于 2011-01-17T19:21:53.927 回答