获取多行更新的最高更新ID

时间:2013-05-17 09:45:12

标签: sql-server

更新:我正在使用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)

但它给了我这个错误 A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed in a SELECT statement that is not the immediate source of rows for an INSERT statement.

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

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

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

1 个答案:

答案 0 :(得分:3)

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

  

使用SET ROWCOUNT不会影响DELETE,INSERT和   下一版SQL Server中的UPDATE语句!

     

不要使用SET   在新开发中使用DELETE,INSERT和UPDATE语句的ROWCOUNT   工作,并计划修改当前使用它的应用程序。另外,为   当前使用SET ROWCOUNT的DELETE,INSERT和UPDATE语句,   我们建议您重写它们以使用TOP语法。

您也可以使用表变量:

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