我已經繼承了一個存儲過程,該存儲過程利用表變量來存儲數據,然後使用正在運行的總計算來更新每一行。表格變量中的記錄順序非常重要,因爲我們希望將卷的排列順序從最高到最低(即當您沿着桌子走下去時,運行總量會越來越大)。在SQL Server表變量中使用運行總計算列
我的問題是,在更新表變量的步驟中,運行總計似乎在計算,但不是以表格變量中的數據先前排序的方式(按最高音量降序排列)
DECLARE @TableVariable TABLE ([ID], [Volume], [SortValue], [RunningTotal])
--Populate table variable and order by the sort value...
INSERT INTO @TableVariable (ID, Volume, SortValue)
SELECT
[ID], [Volume], ABS([Volume]) as SortValue
FROM
dbo.VolumeTable
ORDER BY
SortValue DESC
--Set TotalVolume variable...
[email protected] = ABS(sum([Volume]))
FROM @TableVariable
--Calculate running total, update rows in table variable...I believe this is where problem occurs?
SET @RunningTotal = 0
UPDATE @TableVariable
SET @RunningTotal = RunningTotal = @RunningTotal + [Volume]
FROM @TableVariable
--Output...
SELECT
ID, Volume, SortValue, RunningTotal
FROM
@TableVariable
ORDER BY
SortValue DESC
結果是,有一個最高音量的記錄,我預計首先計算的運行總數(因此運行總數= [音量]),不知何故最終會進一步下降到列表中。正在運行的總似乎計算隨機
這是我期望得到:
但這裏是代碼實際上產生:
不知道有一種方法可以讓UPDATE語句在表變量上得到執行,以便按體積desc排序?從我迄今爲止讀過的內容來看,它可能是一個表變量的排序行爲的問題,但不知道如何糾正?誰能幫忙?
不要這樣做。您正在使用俗稱的古怪更新方法。鑑於這是一個表變量,我已經知道你正在違背這項技術中的一些已知問題。此工作正確需要聚簇索引。看看這篇討論這種技術的文章。 http://www.sqlservercentral.com/articles/T-SQL/68467/確保您閱讀了評論。這種方法沒有文件記錄,而且爭議很大。 Windows功能在這裏更適合你。 –
[運行總計的最佳方法 - 爲SQL Server 2012更新](https://sqlperformance.com/2012/07/t-sql-queries/running-totals) – GarethD
您的圖像都顯示按降序排序的卷,並按總排序升序排序,我沒有看到問題... – Zack