2014-09-03 156 views
2

令人费解了在这一个几个小时的数字(2-4)的一个循环序列更新数据库表字段,冲刷谷歌并没有什么..如何使用

我试图更新一个SQL Server表的每一行中的数字(2,3,4)的一个循环序列..

update table 
set fieldname = (*black magic*) 
where otherfieldname = something 

那么结果将是

other fields|2|other fields| 
other fields|3|other fields| 
other fields|4|other fields| 
other fields|2|other fields| 
other fields|3|other fields| 
other fields|4|other fields| 
other fields|2|other fields| 
other fields|3|other fields| 

任何想法表示欢迎!

欢呼声

回答

0

您可以使用row_number生成递增的连续数字。利用这一MOD 3获得数0 2之间,然后加入2到使它和4间2

WITH T 
    AS (SELECT *, 
       (ROW_NUMBER() 
        OVER (ORDER BY @@SPID) % 3) + 2 AS X 
     FROM YourTable) 
UPDATE T 
SET YourCol = X 
0

NTILE(上限)将提供偶数分配给你的表。 “限制”在哪里应该有多少不同的值。只需为你的偏移加1。

with t1 as (
select *, blackMagic = ntile(3) over(order by newid()) + 1 
from someTable 
) 
update t1 
set fieldname = blackMagic 
+0

我现在不在个人电脑上测试,但我想这样做的计划效率会比我的答案低,因为这种排序。另外我不记得NTile是否会添加一个通用的子表达式。 – 2014-09-03 18:37:51

+0

嗯...我不知道他们之间会有很大的区别,他们都是窗口函数,需要在整个结果集中。可能值得测试,但可以用'@@ spid'轻松替换'newid()'并测试性能。在一张大桌子上看到结果会很有趣。 – aas4mis 2014-09-03 18:45:34

+0

是的。用@@ spid替换会避免排序。我认为NTile增加了一个假脱机,尽管这在行号版本中不会出现(尽管在某些情况下该计划可能还有一个用于万圣节保护的假脱机) – 2014-09-03 18:50:38