2012-11-06 106 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! –