sql - T-SQL 变量计数器不递增

标签 sql sql-server tsql

我需要增加计数器并更新我的数据库表中的行,但由于某些原因它没有增加。 谁能看出这个 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));

关于sql - T-SQL 变量计数器不递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40432243/

相关文章:

c# - ASP.NET MVC 和 SQL SERVER 中的日期时间全局化

sql-server-2005 - T-SQL - 返回自定义错误消息并结束查询

mysql - 外键是否会减慢连接查询的速度?

SQL Server 2012 - 积压和结转的运行总计

c# - ado.net 中的 where 子句中的空值参数

sql - T-SQL 动态列日期

sql-server-2008 - 使用顺序整数更新表

sql - 查找表中具有相关最大日期行列匹配值的行?

php - 在 SQL 中第 n 次执行后,ajax 返回成功

c# - 错误 : 0x1 at XX: Exception has been thrown by the target of an invocation