如果我有表測試有兩列NUM1和NUM2和它下面的觸發器,它只是增加對NUM1的刀片NUM2:SQL服務器 - 重寫觸發器,以避免基於遊標的方法
DECLARE @PROC_NEWNUM1 VARCHAR (10)
DECLARE @NEWNUM2 numeric(20)
DECLARE my_Cursor CURSOR FOR SELECT num1 FROM INSERTED;
OPEN my_Cursor
FETCH NEXT FROM my_Cursor into @PROC_NEWNUM1
WHILE @@FETCH_STATUS = 0
BEGIN
select @NEWNUM2 = MAX(num2) from TEST
if @NEWNUM2 is null
Begin
set @NEWNUM2 = 0
End
set @NEWNUM2 = @NEWNUM2 + 1
UPDATE TEST SET num2 = @NEWNUM2 WHERE num1 = @PROC_NEWNUM1
FETCH NEXT FROM my_Cursor into @PROC_NEWNUM1
END
CLOSE my_Cursor
DEALLOCATE my_Cursor
有沒有辦法使用基於集合的方法重寫上述內容?
(如果有人想知道爲什麼我這樣做,這裏的背景是: SQL Server A trigger to work on multiple row inserts)
解決方案,而無需使用ROW_NUMBER臨時表(SQL 2005年起只):
SELECT @MAXNUM2 = MAX(num2) FROM TEST
if @MAXNUM2 IS NULL
BEGIN
SET @MAXNUM2=0
END
UPDATE TEST
SET num2 = @MAXNUM2 + SubQuery.R
FROM
(
SELECT num1, ROW_NUMBER() OVER (ORDER BY num1) as R FROM inserted
)
SubQuery
INNER JOIN TEST on SubQuery.num1 = TEST.num1
觸發器是魔鬼玩具。 。:D – 2010-02-02 11:53:54