Не удается заставить работать оператор SQL IF - получение: не удалось связать многоэлементный идентификатор "d.ExpiryDate" - PullRequest
1 голос
/ 06 июля 2010

Я пытаюсь вызвать оператор IF для моего триггера, чтобы он не заархивировал просроченные файлы. (Я хочу сохранить только те файлы, которые были удалены, но срок их действия не истек)

Моя ошибка: не может быть привязан идентификатор из нескольких частей "d.ExpiryDate".

Мой код:

    ALTER TRIGGER [dbo].[ArchiveDB] 
   ON  [dbo].[TBL_Content] 
   AFTER DELETE
AS 

BEGIN

declare @ContentID int

set @ContentID = (select ContentID from deleted)

IF (d.ExpiryDate > getDate() )
    begin
        insert into ArchiveBackup.dbo.TBL_Deleted_Content
        (ContentID, StartDate, ExpiryDate, Title... etc)
        select 
        d.ContentID,d.StartDate,d.ExpiryDate,d.Title... etc 
        from deleted as d
    end

END

Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 06 июля 2010

Нет нигде таблицы или представления, в котором вы бы использовали псевдоним d - неудивительно, что он не может его найти!

В этом случае вам необходимо использовать полное имя таблицы:

ALTER TRIGGER [dbo].[ArchiveDB] 
  ON  [dbo].[TBL_Content] AFTER DELETE
AS BEGIN

declare @ContentID int

set @ContentID = (select ContentID from deleted)

IF (deleted.ExpiryDate > getDate() )
BEGIN
        insert into ArchiveBackup.dbo.TBL_Deleted_Content
        (ContentID, StartDate, ExpiryDate, Title... etc)

        select 
        d.ContentID,d.StartDate,d.ExpiryDate,d.Title... etc 
        from deleted as d
END
END

Псевдоним d только когда-либо объявляется и используется внутри BEGIN ... END блока - он не видим вне этого блока!Вы можете использовать псевдоним таблицы только в операторе, который ее объявляет - он не виден глобально.

1 голос
/ 06 июля 2010

Вы должны указать SQL Server, где найти ExpiryDate, например:

if ((select ExpiryDate from deleted) > getdate())

Имейте в виду, что триггер может быть вызван для случаев, когда несколько строк были удалены. Может быть, лучше заменить весь if контракт на запрос:

insert into ArchiveBackup.dbo.TBL_Deleted_Content
(ContentID, StartDate, ExpiryDate, Title... etc)
select 
d.ContentID,d.StartDate,d.ExpiryDate,d.Title... etc 
from deleted as d
where ExpiryDate > getdate()

Или, что еще лучше, напишите хранимую процедуру, которая удаляет строки, а не удаляет их непосредственно из таблицы. Хранимые процедуры легче понять и поддерживать, чем триггеры.

0 голосов
/ 06 июля 2010

Я считаю, что это то, что вам нужно, так как это будет правильно обрабатывать случаи, когда вы удаляете более одной строки за раз, а также проверять условия, которые вы хотите для каждой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...