gpt4 book ai didi

SQL Server - 重写触发器以避免基于游标的方法

转载 作者:行者123 更新时间:2023-12-01 04:20:09 25 4
gpt4 key购买 nike

如果我有包含两列 num1 和 num2 的表 Test 以及其上的以下触发器,它只会在插入 num1 时增加 num2:

 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

最佳答案

只是一个想法:

开始 tran 以避免更改测试

声明@max int

从测试中选择 @max = max(num2)

创建一个带有 num1 和自动增量索引的临时表(例如:idx(从 1 开始)

将您的 INSERTED 插入临时表

插入 test(num1, num2) 从 tmp 中选择 num1, idx+@max

端转

关于SQL Server - 重写触发器以避免基于游标的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2183748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com