在这里,我有一个Plant_Component
列,CODE
列。
我们在Web应用程序中插入了一些代码来自动计算Plant_Component.CODE
中新插入记录的值,现在我必须进行一些清理并在Plant_Component
表中插入正确的值{{ 1}}。
计算代码的逻辑是:
CODE = 'testcode'
我使用的查询是:
Plant_Component.CODE
问题是在受此查询影响的每一行中都插入了相同的值。为了解释自己,当我测试这个时,我的最大整数值是507007,受影响的每一行都更新了值507008 ......
是否有办法使受影响的每一行都会将此值增加1?
实施例: 如果我现在启动查询时我的最大代码是507007,并且查询影响了三条记录,我希望这三条记录的代码分别为507008,507009,507010。
注意:我知道识别值的方式,因为整数不是万无一失的,但这是一次性启动脚本,我知道没有值会导致错误(例如,我认为价值'9999999999999999999999999999999999'可能会崩溃这个)
答案 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))
注意:您也应CAST
或CONVERT
使用长度参数。我在此假设您的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);
我的代码可能无法完全适用于您的情况,但您可以根据自己的需要进行调整。
我希望有所帮助。