Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过使用中间条件从SQL Server数据库中删除行只删除一条记录(范围内的最后一条)_Sql_Sql Server - Fatal编程技术网

通过使用中间条件从SQL Server数据库中删除行只删除一条记录(范围内的最后一条)

通过使用中间条件从SQL Server数据库中删除行只删除一条记录(范围内的最后一条),sql,sql-server,Sql,Sql Server,例如,我有一个带有这些记录的表日期。请参见屏幕截图: 此表的DLT列类型为bit bool,默认为0 false 我为这个表创建了一个Instead of delete触发器,当我删除一行时,它不会被真正删除,而是DLT列的值被更改为1 true ALTER TRIGGER [dbo].[TrgDltDate] ON [dbo].[Date] INSTEAD OF DELETE AS BEGIN DECLARE @DeletedID INT SELECT @DeletedI

例如,我有一个带有这些记录的表日期。请参见屏幕截图:

此表的DLT列类型为bit bool,默认为0 false

我为这个表创建了一个Instead of delete触发器,当我删除一行时,它不会被真正删除,而是DLT列的值被更改为1 true

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 condition for delete将DLT列值更改为1某些记录时,只需删除将DLT列值更改为1范围内的最后一条记录,例如:

DELETE FROM dbo.Date 
WHERE DateID BETWEEN 2 AND 6
它只是删除了将DateID=6的记录的DLT列值更改为1
但是,当我禁用该触发器而不是删除时,两者之间的关系正常工作。怎么了?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;

也就是说,所有被删除的行都被传递到触发器中,并进入已删除的表(实际上是一个伪表)。您希望删除所有的id,而不是一个,因此无法将id存储在变量中。

yesss。它工作正常。有很多兄弟。还有一个问题,从已删除的d中选择d.DateID中的d是什么?@mohamdJ.A。这是一个表别名。在这种情况下,这不是严格需要的,但这是一个很好的做法。我明白了。又是tnx