2017-04-03 33 views
1

我目前正試圖使用​​UPDATE語句,同時還試圖取消UPDATE語句當變量達到一定值更新本地變量:MS SQL - 如何更新局部變量並在WHERE條件中有變量?

UPDATE table 
SET @var = @var + 1, 
    field = @var 
WHERE @var < 10 

這很不幸,因爲它運行於所有不工作記錄,而不是隻有10.有沒有人有一個想法如何優雅地解決這個問題,而不使用循環? 謝謝!

編輯: 我想要做的是不分配某種投票給派對。假設一個派對獲得總票數的36.47%。所以我計算了這個派對的0.47%(整數部分的削減)的比率。現在我按照DESC的比例訂購我的結果表,並且只要還有投票,就向每一方添加一票。其餘的選票存儲在變量中。這太簡單了,但我希望你能得到我想要做的。

+1

其實您正在嘗試做什麼?示例表數據和Update之後的所需輸出將有助於快速獲得解決方案 –

+0

您需要將其寫爲WHILE循環。 http://stackoverflow.com/questions/753947/using-while-loop-for-sql-server-update –

+0

而在你的代碼更新,你正在更新整個表。這是你想要做什麼? –

回答

4

您可以通過使用ROW_NUMBER()來實現您正在嘗試執行的操作。這裏有一個簡單的例子:

declare @t table (field int not null, Ord int not null) 
insert into @t(field,Ord) values (0,1),(0,2),(0,3),(0,4),(0,5) 

;With Numbered as (
    select 
     *, 
     ROW_NUMBER() OVER (ORDER BY Ord) as rn 
    from 
     @t 
) 
update Numbered 
set field = rn 
where rn < 4 

select * from @t 

結果:

field  Ord 
----------- ----------- 
1   1 
2   2 
3   3 
0   4 
0   5 

這裏,被一CTE內部產生和使用適當的柱,使行號訂貨明確定義(如您的編輯建議你有類似的東西可用)。我們還可以利用您可以針對CTE而不是基表編寫UPDATE(假設UPDATE明確只嘗試更新單個表)