Заменить вид триггером - PullRequest
       1

Заменить вид триггером

0 голосов
/ 17 января 2011

У меня есть представление, которое я надеялся создать индекс, по которому происходит сбой, потому что мне нужно будет индексировать вычисляемый столбец (это не так с кодом ошибки 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 Ответ

1 голос
/ 17 января 2011

Вы можете материализовать 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]) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...