2016-11-04 95 views
1

我需要增加計數器並更新我的數據庫表中的行,但有一些原因是它沒有遞增。 任何人都可以看到這個T-SQL有什麼問題嗎?T-SQL變量計數器不增加

DECLARE @id INT 
DECLARE @name NVARCHAR(100) 
DECLARE @getid CURSOR 
declare @counter int 
    set @counter = 0 
SET @getid = CURSOR FOR 
SELECT ShipmentTrackingNumber, 
     Courier 
FROM Shipping WHERE (ShipmentTrackingNumber = '') 
OPEN @getid 
FETCH NEXT 
FROM @getid INTO @id, @name 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    UPDATE SHipping SET ShipmentTrackingNumber = 'STN00000' + cast(@counter as VARCHAR(16)) 
    set @counter = @counter + 1 
    FETCH NEXT 
    FROM @getid INTO @id, @name 
END 
CLOSE @getid 
DEALLOCATE @getid 
+2

您可以使用row_number做爲單個更新語句而不是循環。更不用說你的更新語句當前正在循環遍歷每個迭代更新整個表。我懷疑這是你想要的。 –

+0

永遠不要滿足rbar ... – Charleh

回答

10

你的問題不是@counter不增加。你的問題是update正在更新所有在每個迭代中的行。沒有where子句,因此每一行都以相同的值結束。

我懷疑你的意圖是一個可更新的遊標,但這不是你寫的。

你真正想要的是這麼多簡單的版本:

with toupdate as (
     select s.*, row_number() over (order by (select null)) as seqnum 
     from shipping s 
     where ShipmentTrackingNumber = '' 
    ) 
update toupdate 
    set ShipmentTrackingNumber = 'STN00000' + cast(seqnum as varchar(16)); 
0

由於您沒有mantioned所以,我假設你的主鍵字段是ID。

以下查詢將獲得最新的ShipmentTrackingNumber號碼,因此我們可以在該號碼後繼續增量處理。

DECLARE @Last_ID INT; 
SELECT @Last_ID = MAX(T.STN) FROM (SELECT RIGHT(ShipmentTrackingNumber,LEN(ShipmentTrackingNumber) - 3) AS STN 
         FROM SHipping WHERE ShipmentTrackingNumber <> '') T 

我已經在那之後,我們正在執行UPDATE語句更新ShipmentTrackingNumber

Update SH 
SET ShipmentTrackingNumber = 'STN' + RIGHT('00000' + CAST(SH1.ROW_ID AS VARCHAR(6)) ,6) 
FROM SHipping SH INNER JOIN (SELECT (ROW_NUMBER() OVER(ORDER BY ID) + @Last_ID) AS ROW_ID,ID 
           FROM SHipping SH1 
           WHERE ISNULL(SH1.ShipmentTrackingNumber,'') = '' 
          ) SH1 ON SH1.ID=SH.ID 

這裏我使用ROW_NUMBER獲得在accending順序的序列號,並在其中加入了最新的ShipmentTrackingNumber數。所以,我們可以得到下一個追蹤​​號碼。

還有一件事我注意到,你的ShipmentTrackingNumber有一些前綴,比如數字前5倍零(即STN000001)。因此,如果使用Right()函數刪除不必要的零,則建議您使用跟蹤編號中的數字位數修復多個數字(即STN000011,STN005210,STN325210)中的數字。

這將幫助您獲得正確的排序順序。