任何人都可以幫我改進SQL 2000中游標邏輯的性能。它在SQl2005和SQL2008中運行良好,但需要至少20分鐘才能在SQL 2000中運行。順便說一句,我永遠不會選擇使用遊標,並且我沒有寫這個代碼,只是試圖讓它運行得更快。將客戶升級到2005/2008並不是最近的選擇。幫助用更好的代碼替換這個SQL遊標
-------------------------------------------------------------------------------
------- Rollup totals in the chart of accounts hierarchy
-------------------------------------------------------------------------------
DECLARE @B_SubTotalAccountID int, @B_Debits money, @B_Credits money, @B_YTDDebits money, @B_YTDCredits money
DECLARE Bal CURSOR FAST_FORWARD FOR
SELECT SubTotalAccountID, Debits, Credits, YTDDebits, YTDCredits FROM xxx
WHERE AccountType = 0 AND SubTotalAccountID Is Not Null and (abs(credits)+abs(debits)+abs(ytdcredits)+abs(ytddebits)<>0)
OPEN Bal
FETCH NEXT FROM Bal INTO @B_SubTotalAccountID, @B_Debits, @B_Credits, @B_YTDDebits, @B_YTDCredits
--For Each Active Account
WHILE @@FETCH_STATUS = 0
BEGIN
--Loop Until end of subtotal chain is reached
WHILE @B_SubTotalAccountID Is Not Null
BEGIN
UPDATE xxx2
SET Debits = Debits + @B_Debits,
Credits = Credits + @B_Credits,
YTDDebits = YTDDebits + @B_YTDDebits,
YTDCredits = YTDCredits + @B_YTDCredits
WHERE GLAccountID = @B_SubTotalAccountID
SET @B_SubTotalAccountID = (SELECT SubTotalAccountID FROM xxx2 WHERE GLAccountID = @B_SubTotalAccountID)
END
FETCH NEXT FROM Bal INTO @B_SubTotalAccountID, @B_Debits, @B_Credits, @B_YTDDebits, @B_YTDCredits
END
CLOSE Bal
DEALLOCATE Bal
我總是喜歡遊標的平面更新。遊標是邪惡的。 有時需要,但仍然邪惡... – AllenG 2010-04-16 15:24:15