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

Sql server 获取多行更新的最高更新ID,sql-server,Sql Server,更新:我正在使用Sql Server 2008 R2 我将更新大量的行,为了避免不必要的锁定,我将在每次更新大约1000行的匹配中这样做 使用SETrowcond我可以将更新限制为1000行,使用WHERE ID>x我可以设置它应该运行的批处理 但是为了让它工作,我需要知道刚处理的批中的最高ID 我可以使用用户OUTPUT返回所有受影响的ID,并在代码中找到最高的ID,但我希望能够只返回最高的ID 我试过这个 SELECT MAX(id) FROM ( UPDATE mytable

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

我将更新大量的行,为了避免不必要的锁定,我将在每次更新大约1000行的匹配中这样做

使用SET
rowcond
我可以将更新限制为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)
但它给了我这个错误
对于不是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(或者根本不使用SET ROWCOUNT),正如BOL所说:

使用SET ROWCOUNT不会影响删除、插入和删除 在SQL Server的下一版本中更新语句

不要使用SET 新开发中带有DELETE、INSERT和UPDATE语句的行数 工作,并计划修改当前使用它的应用程序。还有 删除、插入和更新当前使用SET ROWCOUNT的语句, 我们建议您重写它们以使用顶级语法

您也可以使用表变量执行此操作:

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

SQLServer2008R2似乎不喜欢TOP的更新,它生成的语法不正确。