T-SQL变量计数器不递增

时间:2016-11-04 21:54:02

标签: sql sql-server tsql

我需要增加计数器并更新我的db表中的行,但有些原因它没有递增。 任何人都可以看到这个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 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

由于您没有提及,我假设您的主键字段是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按顺序获取序列号,并在其中添加了最新的ShipmentTrackingNumber号码。因此,我们可以获得下一个跟踪号码。

还有另一件事我注意到你的ShipmentTrackingNumber有一些前缀,比如数字之前为零(即STN000001)。因此,如果值以多位数(即STN000011STN005210STN325210)增加,我建议您使用修正跟踪号码中的位数,方法是使用{删除不必要的零{1}}功能。

它可以帮助您获得正确的排序顺序。