使用不同的增量值更新多个记录

时间:2016-02-16 10:47:06

标签: sql-server tsql

在这里,我有一个Plant_Component列,CODE列。 我们在Web应用程序中插入了一些代码来自动计算Plant_Component.CODE中新插入记录的值,现在我必须进行一些清理并在Plant_Component表中插入正确的值{{ 1}}。

计算代码的逻辑是:

  • CODE = 'testcode'
  • 获取所有值
  • 仅选择整数
  • 的值
  • 从这些整数值中获取最大值
  • 将1加到最大值,这就是我的代码。

我使用的查询是:

Plant_Component.CODE

问题是在受此查询影响的每一行中都插入了相同的值。为了解释自己,当我测试这个时,我的最大整数值是507007,受影响的每一行都更新了值507008 ......

是否有办法使受影响的每一行都会将此值增加1?

实施例: 如果我现在启动查询时我的最大代码是507007,并且查询影响了三条记录,我希望这三条记录的代码分别为507008,507009,507010。

注意:我知道识别值的方式,因为整数不是万无一失的,但这是一次性启动脚本,我知道没有值会导致错误(例如,我认为价值'9999999999999999999999999999999999'可能会崩溃这个)

4 个答案:

答案 0 :(得分:2)

您可以使用CTE作为执行UPDATE的更便捷方式:

;WITH ToUpdate AS (
  SELECT p.CODE AS CODE, 
         ROW_NUMBER() OVER (ORDER BY CODE) + t.maxVal  AS newCode
  FROM Plant_Component AS p
  CROSS JOIN (
     SELECT MAX(CAST(CODE AS integer)) AS maxVal
     FROM Plant_Component
     WHERE ISNUMERIC(CODE) = 1 AND CODE NOT LIKE  '%[^0-9]%') AS t
  WHERE p.CODE = 'testcode'
)  
UPDATE ToUpdate
SET CODE = CAST(newCode AS VARCHAR(100))

注意:您也应CASTCONVERT使用长度参数。我在此假设您的CODE字段属于VARCHAR(100)类型。

答案 1 :(得分:2)

试试这个:

Declare @id int
select @id = isnull(max(code),0)+1 from plant_component
Update plant_component set code = @id, @id=@id+1 where code is null

答案 2 :(得分:1)

在代码之前添加:

DECLARE @a int SET @a = 1

然后更新代码中的update部分,如下所示:

SET CODE = CONVERT(varchar, CONVERT(integer, PCread.CODE) + @a), @a:=@a+1

答案 3 :(得分:0)

您可以尝试在CTE中使用ROW_NUMBER()窗口函数来生成需要更新的行的序列号。然后,您可以将该数字添加到表中任何数值的最大值。

您没有说明表中可用的其他字段,但我假设您有一些主键,需要将CTE连接到UPDATE的基表。我的例子是int类型的PK'id'。我的ROW_NUMBER()窗口函数在CODE列上进行分区,这意味着如果你有任何不同的CODE值,ROW_NUMBER将重置为1。

HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE);

我的代码可能无法完全适用于您的情况,但您可以根据自己的需要进行调整。

我希望有所帮助。