我需要增加计数器并更新我的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
答案 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
)。因此,如果值以多位数(即STN000011
,STN005210
,STN325210
)增加,我建议您使用修正跟踪号码中的位数,方法是使用{删除不必要的零{1}}功能。
它可以帮助您获得正确的排序顺序。