2012-03-16 91 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

相關問題