SQL Server更新循环/光标

时间:2014-03-28 18:21:08

标签: sql sql-server cursor

Index   Columns         Text          New Index
===========================================
1   ISOCountry  TH          1
-------------------------------------------
2   Country        Thailand         1
-------------------------------------------
3   Region         Asia         1
-------------------------------------------
4   Date           12/31/2014       1
-------------------------------------------
5   Holiday        New Years Eve    1
-------------------------------------------
7   ISOCountry     DE           2
-------------------------------------------
8   Country        Germany          2
-------------------------------------------
9   Region         EMEA             2
-------------------------------------------
10  Date           12/31/2014       2
-------------------------------------------
11  Holiday        New Years Eve    2
-------------------------------------------
13  ISOCountry  DK          3
-------------------------------------------
14  Country         Denmark         3
-------------------------------------------
15  Region          EMEA            3
-------------------------------------------
16  Date            12/31/2014  3
-------------------------------------------
17  Holiday         New Years Eve   3
-------------------------------------------

我有一个如上所述的专栏。我需要SQL Server中的循环/游标,以便每次“列”列更改为ISOCountry时,新索引列必须递增1. 这意味着对于第1行到第5行,“新建索引”列具有值1,对于第7行到第11行,新索引值必须为2,依此类推。对于其他列,“列”更改为ISO国家/地区的新指数值必须更改为2。我将在所有

中拥有大约10000行

我们将非常感谢这方面的任何帮助。感谢

2 个答案:

答案 0 :(得分:1)

为什么要使用循环?只需将newindex值设置为ID较低的isocountry条记录。您可以使用相关子查询(以及其他方法)执行此操作:

update table t
    set newindex = (select count(*)
                    from table t2
                    where t2.columns = 'IsoCountry' and
                          t2."index" <= t."index"
                   );

答案 1 :(得分:1)

这将根据当前记录之前的ISOCountry记录数设置newIndex:

UPDATE A
SET newIndex = B.newIndex
FROM [myTable] A
CROSS APPLY (
    SELECT COUNT(*) [newIndex]
    FROM [myTable] X
    WHERE   X.[Index] <= A.[Index]
        AND X.[Columns] = 'ISOCountry'
) B