2016-11-04 92 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)中的数字。

这将帮助您获得正确的排序顺序。