如何在MSSQL中更新列的多个记录?

时间:2018-11-02 09:17:46

标签: sql-server

我想通过将其值增加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

2 个答案:

答案 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,所以它是NULLNULL + 1 = NULLNULL <= [somenumber] = UNKNOWN,因此您实际上从未更新过任何内容。解决方案是使用与@num相同的方式设置@IncrementedValue

顺便说一句,您也可以基于ROW_NUMBER()进行此设置。如果您的代码工作正常,您将多次更新相同的行(最终使用相同的代码),因为您为记录code更新了where Code != null的每个循环(是IS (NOT?) NULL)。