簡體   English   中英

通過使用BETWEEN條件從SQL Server數據庫中刪除行,只需刪除一條記錄(范圍中的最后一條)

[英]Delete rows from SQL Server database by using BETWEEN condition just delete one record (the last one in range)

例如,我有一個包含這些記錄的表Date (請參見屏幕截圖):

圖片

該表的列DLT類型為bit (布爾),默認為0(false)。

我為此表創建了一個“ Instead of delete觸發器,當我刪除一行時,它並不會真正刪除,而是將DLT列的值更改為1(真)。

ALTER TRIGGER [dbo].[TrgDltDate] 
ON [dbo].[Date] 
INSTEAD OF DELETE
AS
BEGIN
    DECLARE @DeletedID INT

    SELECT @DeletedID = deleted.DateID 
    FROM deleted

    UPDATE dbo.Date 
    SET DLT = 1, LastModificationDate = GETDATE() 
    WHERE DateID = @DeletedID
END

當我使用“ BETWEEN”條件刪除(將“ DLT”列的值更改為1)時,某些記錄僅刪除(將“ DLT”列的值更改為1)范圍內的最后一條記錄,例如:

DELETE FROM dbo.Date 
WHERE DateID BETWEEN 2 AND 6

它只是為DateID = 6的記錄刪除(將“ DLT”列值更改為1),但是當我禁用該觸發器( Instead of delete )時,“ Between”可以正常工作。 怎么了 ? TNX。

您的觸發器僅更改一行。 在SQL Server中,觸發器是集合操作,因此您應將其視為集合:

ALTER TRIGGER [dbo].[TrgDltDate] ON [dbo].[Date] INSTEAD OF DELETE
AS
BEGIN
    UPDATE dbo.Date
        SET DLT = 1,
        LastModificationDate = GETDATE()
    WHERE DateID IN (SELECT d.DateID FROM Deleted d)
END;

也就是說,所有要刪除的行都將傳遞到觸發器中的deleted “表”(實際上是偽表)中。 您想刪除所有的對象,而不僅僅是一個,所以不能將id存儲在變量中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM