T-SQL变量计数器不增加
问题描述:
我需要增加计数器并更新我的数据库表中的行,但有一些原因是它没有递增。 任何人都可以看到这个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
答
你的问题不是@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));
答
由于您没有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
)中的数字。
这将帮助您获得正确的排序顺序。
您可以使用row_number做为单个更新语句而不是循环。更不用说你的更新语句当前正在循环遍历每个迭代更新整个表。我怀疑这是你想要的。 –
永远不要满足rbar ... – Charleh