2013-05-17 115 views
4

更新:我正在使用Sql Server 2008 R2。獲取多行更新的最高ID

我要更新大量的行並避免不必要的鎖定我將在每次更新大約1000行的匹配中執行此操作。

使用SET ROWCOUND我可以限制更新到1000行,並使用WHERE ID > x我可以設置它應該運行的批次。

但是爲了這個工作,我需要知道剛剛處理的批次中的最高ID。

我可以讓用戶OUTPUT返回所有受影響的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 

有對此的任何解決方法,任何人都可以解釋爲什麼我可以將結果插入到表中,但不只是返回結果?

回答

3

不要使用SET ROWCOUNT這個(或全部),如BOL說:

使用SET ROWCOUNT將不會影響DELETE,INSERT和 UPDATE語句在SQL Server的下一個版本!

不要使用SET ROWCOUNT DELETE,INSERT和UPDATE語句在新開發中 工作,並計劃修改當前正在使用它的應用程序。另外,對於當前使用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 
+0

的Sql Server 2008 R2中似乎不喜歡TOP與更新,它會產生不正確的語法。 –

+0

但解決方案工作:) –