我想通过将其值增加1来更新表中的列。 在这里,我附上了我尝试过的代码
declare @count int
, @num int
, @Seed VARCHAR(10) = 'PR0001'
, @IncrementedValue int = 0
, @Code varchar(10)
set @count = (select Count(*) from psa.ProductDemo)
while @num <= @count
begin
update psa.ProductDemo
set Code='PR' + right('0000' + cast(@IncrementedValue as varchar(10)),4)
where Code != null
set @IncrementedValue = @IncrementedValue + 1
set @num = @num + 1
end
select *
from psa.ProductDemo
输出
1-)
457B995D-CF6E-4126-A006-A8E45D36A246 PR0002 Toothed Fruit Mill NULL 2018-01-06 00:00:00.000 NULL 8435 NULL 2018-11-02 12:26:20.923 NULL NULL NULL
2-)
B5F46B95-EA8D-4988-9536-45757E371B14 PR0002 Accessories for Disintegrator NULL 2018-01-10 00:00:00.000 NULL 8479 NULL 2018-11-02 12:26:20.923 NULL NULL NULL
答案 0 :(得分:4)
您不想在这里使用循环/ std::numeric_limits<int>::max()
,它会非常慢。更好的方法是使用CURSOR
和CTE。
ROW_NUMBER()
请注意大括号(WITH CTE AS(
SELECT Code,
ROW_NUMBER() OVER (ORDER BY {ORDER BY COLUMN}) AS RN
FROM psa.ProductDemo
WHERE Code IS NOT NULL -- != NULL won't work
)
UPDATE CTE
SET Code = 'PR' + RIGHT('0000' + CONVERT(varchar(4),RN),4);
)中的这一部分,您需要引起注意。另外,请注意有关{}
的评论。 code != NULL
将始终返回{expression} (=/!=/>/</etc) NULL
(因此永远不会为真)。比较Unknown
时,您始终需要使用NULL
。
答案 1 :(得分:2)
您最初从未设置@num
,所以它是NULL
。 NULL + 1 = NULL
和NULL <= [somenumber] = UNKNOWN
,因此您实际上从未更新过任何内容。解决方案是使用与@num
相同的方式设置@IncrementedValue
。
顺便说一句,您也可以基于ROW_NUMBER()
进行此设置。如果您的代码工作正常,您将多次更新相同的行(最终使用相同的代码),因为您为记录code
更新了where Code != null
的每个循环(是IS (NOT?) NULL
)。