更新:我正在使用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
有没有解决方法,任何人都可以解释为什么我可以将结果插入表中而不只是返回结果?
答案 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