2012-11-06 111 views
0

有没有什么方法可以用1从1开始的升序序列填充空列,而不使用标识?用序列填充空列

我尝试以下光标但它对于在列中的所有行填充相同的值(450):

declare cur3 cursor for 
select new_id from sheet1$ 
declare @no int 
declare @no1 int 
set @no1 = 1 
open cur3 
fetch next from cur3 into @no 
while(@@FETCH_STATUS = 0) 
begin 
update sheet1$ set new_id = @no1 
set @no1 = @no1 + 1 
fetch next from cur3 into @no 
end 
close cur3 
deallocate cur3 
+0

你想使用哪种语言? MySQL的?标准SQL?微软SQL? TSQL? – Jocelyn

+0

@Jocelyn:即时通讯使用sql server ... so tsql ...谢谢 –

回答

3

的问题是,你缺少从您的更新查询WHERE条款,所以每次循环正在更新中的所有行。它应该是: - 说明

UPDATE sheet1$ 
SET  new_id = @no1 
WHERE New_ID = @No -- ONLY UPDATE 1 ROW 

正如顺便说一句,假设您的SQL服务器的标签是正确的,你可以使用ROW_NUMBER()功能

WITH CTE AS 
( SELECT New_ID, [RN] = ROW_NUMBER() OVER(ORDER BY New_ID) 
    FROM yourTable 
) 
UPDATE CTE 
SET  New_ID = RN 

编辑做这没有光标

ROW_NUMBER只是提供一个数字序列,Common Table Expression就像是一个动态视图:

If you run: 

WITH CTE AS 
( SELECT New_ID, [RN] = ROW_NUMBER() OVER(ORDER BY New_ID) 
    FROM yourTable 
) 
SELECT * 
FROM CTE 

您应该对CTE内正在做的事情有个更好的了解,那么CTE的美妙之处在于您可以直接更新它们而无需返回原始表格,因此更新CTE相当于:

UPDATE yourTable 
SET  New_ID = RN 
FROM yourTable 
     INNER JOIN 
     ( SELECT New_ID, [RN] = ROW_NUMBER() OVER(ORDER BY New_ID) 
      FROM yourTable 
     ) n 
      ON n.New_ID = yourTable.New_ID; 
+0

惊人的...完美的工作!你能解释一下这个逻辑吗......非常感谢 –

+0

谢谢Gareth! –