2011-12-16 69 views
1

需要使用遊標從另一個存儲採購和更新,只有選擇的值SQL服務器遊標不工作

更新的值我有以下幾點:

DECLARE upd_cursor CURSOR FOR 
SELECT * FROM Terr 
WHERE Text = "RightT" ; 

OPEN upd_cursor; 

-- Perform the first fetch. 
FETCH NEXT FROM upd_cursor; 

-- Check @@FETCH_STATUS to see if there are any more rows to fetch. 
WHILE @@FETCH_STATUS = 0 
BEGIN 

exec usp_Gent @valback OUTPUT; 
update Terr 
set Text = @valback 

FETCH NEXT FROM upd_cursor; 
END 

CLOSE upd_cursor; 
DEALLOCATE upd_cursor; 
GO 

在我的情況下,更新所有領域在桌子裏。我在做什麼錯了

+1

您沒有使用遊標的更新語法。每次循環時,您的代碼都會更新Terr表中的所有行。話雖如此。同意下面。在這種情況下沒有理由使用遊標。用Upadate ...更好......其中「 – Anon246 2011-12-16 22:44:58

+0

我不知道,你想達到什麼目的? – 2011-12-16 23:33:23

回答

1

如果你真的想要做逐行更新,你可以使用CURRENT OF語法。如果您對存儲過程的調用每個都返回不同的結果,情況就是這樣。

例如

 update Terr 
    set Text = @valback 
    WHERE CURRENT OF upd_cursor 
3
update Terr 
set Text = @valback 

您在此聲明中未設置WHERE條件。

另外,你爲什麼使用遊標?

+4

+1正確答案+1用於提問使用遊標。我不能+2我可以嗎? – Twelfth 2011-12-16 22:41:10

3

您的update聲明中沒有where子句。

更一般地,你應該使用一個update條款要做到這一點,而不是光標:

exec usp_Gent @valback OUTPUT; 
update Terr set 
    Text = @valback 
where 
    Text = 'RightT'; 

除非你usp_Gent做,我失去了一些東西。

你想要一個單獨的子句而不是做一個的原因是每一行是因爲SQL認爲集合更好。每個update你有開銷 - 它打開一個事務,記錄它正在做什麼,然後提交該事務。如果你必須做成千上萬個,這非常慢。你真正想要做的只是一次更新數千行 - 這是數據庫用關係代數做的事情,他們真的很擅長這樣做。想一組,而不是按順序。

+2

+1對於基於集合的解釋 – Anon246 2011-12-16 22:46:16