gpt4 book ai didi

sql-server - 获取多行更新的最高更新ID

转载 作者:行者123 更新时间:2023-12-03 03:24:20 24 4
gpt4 key购买 nike

更新:我正在使用 Sql Server 2008 R2。

我将更新大量行,为了避免不必要的锁定,我将在每次更新大约一千行的匹配中执行此操作。

使用 SET ROWCOUND 我可以将更新限制为 1000 行,使用 WHERE ID > x 我可以设置它应该运行哪个批处理。

但要实现此目的,我需要知道刚刚处理的批处理中的最高 ID。

我可以使用OUTPUT返回所有受影响的ID并找到代码中最高的ID,但我希望能够仅返回最高的ID。

我试过了

SELECT MAX(id) 
FROM (
UPDATE mytable
SET maxvalue = (SELECT MAX(salesvalue) FROM sales WHERE cid = t.id GROUP BY cid)
OUTPUT inserted.id
FROM mytable t
WHERE au.userid > 0
) updates(id)

但是它给了我这个错误如果 SELECT 语句不是 INSERT 语句的直接行源,则不允许在 SELECT 语句中使用嵌套的 INSERT、UPDATE、DELETE 或 MERGE 语句。

但是如果我尝试将结果直接插入表中,它是有效的

CREATE TABLE #temp(id int)

INSERT INTO #temp
SELECT MAX(id)
FROM (
UPDATE mytable
SET maxvalue = (SELECT MAX(salesvalue) FROM sales WHERE cid = t.id GROUP BY cid)
OUTPUT inserted.id
FROM mytable t
WHERE au.userid > 0
) updates(id)

drop table #temp

对此有任何解决方法吗?有人可以解释为什么我可以将结果插入表中而不只是返回结果吗?

最佳答案

不要为此使用 SET ROWCOUNT(或者根本不要使用),正如 BOL 所说:

Using SET ROWCOUNT will not affect DELETE, INSERT, andUPDATE statements in the next release of SQL Server!

Do not use SETROWCOUNT with DELETE, INSERT, and UPDATE statements in new developmentwork, and plan to modify applications that currently use it. Also, forDELETE, INSERT, and UPDATE statements that currently use SET ROWCOUNT,we recommend that you rewrite them to use the TOP syntax.

您也可以使用表变量来做到这一点:

DECLARE @Log TABLE (id INT NOT NULL);

UPDATE TOP 1000 mytable
SET maxvalue = (SELECT MAX(salesvalue) FROM sales WHERE cid = t.id GROUP BY cid)
OUTPUT inserted.id INTO @Log
FROM mytable t
WHERE au.userid > 0

SELECT maxid = MAX(id)
FROM @Log

关于sql-server - 获取多行更新的最高更新ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16606029/

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