2012-03-16 53 views
1

我不得不对触发器进行更改,并假定运行如下更新查询会使触发器对所有匹配的行执行。但是,它只会更新它找到的记录。有没有办法强制触发器在多行更新语句上运行?

UPDATE someTable SET someField = someField WHERE someField = 'something'; 

作为一个快速的解决方案,我用游标来遍历记录并更新每一行创建下面的查询。它有效,幸运的是我没有一个非常大的数据集,所以它不需要太长的时间,但它看起来并不是最好的解决方案。

DECLARE @id INT; 
DECLARE queryCursor CURSOR FOR 
SELECT id FROM someTable WHERE someField='something' 

OPEN queryCursor 
FETCH NEXT FROM queryCursor INTO @id 
WHILE @@FETCH_STATUS = 0 
BEGIN 
UPDATE someTable SET someField = someField WHERE id = @id 
FETCH NEXT FROM queryCursor INTO @id 
END 

CLOSE queryCursor 
DEALLOCATE queryCursor 

有没有更好的方法来获得在SQL Server中的多行执行触发器?

编辑:从触发代码

FOR INSERT, UPDATE 
AS 
IF UPDATE (LineNumber) 
OR UPDATE(LineService) 

Begin 

DECLARE @CDL VARCHAR(50) 
DECLARE @LN VARCHAR(100) 
DECLARE @A VARCHAR(25) 

SELECT @CDL = CommonDataLink FROM INSERTED 
SELECT @A = LineService FROM INSERTED 

SET @LN = @CDL + @A 

UPDATE CommonData SET ReportedLineNo = @LN WHERE CommonDataLink = @CDL 

End 
+1

是修复触发器不是调用代码!我们需要触发器代码来帮助你修复它,但是触发器在一组数据上不是一个记录,如果你在触发器中设置了从插入或删除的值到标量变量,它几乎肯定是不正确的,需要被修复。 – HLGEM 2012-03-16 14:48:32

回答

3

你必须要使用特殊的表INSERTED的你想要的东西:

更新的代码

FOR INSERT, UPDATE 
AS 
IF UPDATE (LineNumber) 
OR UPDATE(LineService) 

Begin 

DECLARE @CDL VARCHAR(50) 
DECLARE @LN VARCHAR(100) 
DECLARE @A VARCHAR(25) 

SELECT @CDL = CommonDataLink FROM INSERTED 
SELECT @A = LineService FROM INSERTED 

SET @LN = @CDL + @A 

UPDATE A 
SET ReportedLineNo = B.LineService + B.CommonDataLink 
FROM CommonData A 
INNER JOIN INSERTED B 
ON A.CommonDataLink = B.CommonDataLink 


End 
+0

这就是我在触发器中所做的,但是当我运行一个影响多行的更新语句时,并没有为每一行执行触发器。 – xecaps12 2012-03-16 14:48:01

+0

@ xecaps12 - 然后告诉我们你的触发器和你想要的效果。当在表上修改或插入多行的事务时,触发器会被执行一次,并且这些特殊表上的所有行都会受到影响 – Lamak 2012-03-16 14:59:09

+0

我向问题添加了触发器。添加它时,我注意到用于获取值的声明变量的数据类型不匹配。我要改变它,看看它是否有效。 – xecaps12 2012-03-16 15:04:31

相关问题