2010-07-06 35 views
1

我想在我的觸發器上調用IF語句,以免歸檔過期文件。 (我只想保留已刪除但尚未過期的文件)無法獲取SQL IF語句 - 獲取:多部分標識符「d.ExpiryDate」無法綁定

我的錯誤是無法綁定多部分標識符「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 

感謝您的幫助!

回答

1

你必須告訴SQL服務器在哪裏可以找到ExpiryDate,如:

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

要知道,一個觸發器可以要求情況下,當多個行,其中刪除。這可能是更好的查詢更換整個if contruct:

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

在這種情況下where語句實際上工作得很好,謝謝!在我的觸發器中使用它雖然 – Spooks 2010-07-06 19:38:34

1

在別處沒有表格或視圖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

+1:你的觸發器比我的更好 – 2010-07-06 19:35:08

+1

你不能直接在'if'中使用字段,你必須首先將它選擇成一個變量。而且,即使你這樣做了,如果你刪除了多行(OP的觸發器有多行同樣的問題,公平),這將會失敗。 – Donnie 2010-07-06 19:36:37

+0

同意Donnie,這會給出錯誤'The多部分標識符「deleted.ExpiryDate」無法被綁定。^ – Andomar 2010-07-06 19:40:01

0

我相信這是您所需要的,因爲這樣可以正確處理您一次刪除多行的情況,並檢查每行所需的條件。

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

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 
    where 
    d.ExpiryDate > getDate() 

END 
相關問題