存储过程中的最后一个条目不会更新

时间:2019-03-11 17:36:56

标签: sql-server stored-procedures sql-update

我在下面编写了存储过程,它运行良好,但是,它不会更新字符串中的最后一个条目。有什么想法吗?

create procedure testProceduretwo 
    @vendorIds varchar(max)
as
    declare @pos int
    declare @vendor varchar(50)
    set @pos = charindex(',', @vendorIds)

    while @pos <> 0
    begin
        set @vendor = left(@vendorIds, @pos-1)
        exec ('update DS_REGISTERED_VENDOR set ppu_flag=''Y'' where Vendor_Id = ' + @vendor + '')
        print 'updated vendor id - ' + @vendor

        set @vendorIds = stuff(@vendorIds, 1, @pos, NULL)
        set @pos = charindex(',', @vendorIds)
    end

    exec ('update DS_REGISTERED_VENDOR set ppu_flag=''Y'' where Vendor_Id = ' +  @vendor + '')

我用这个叫它:

exec testProceduretwo '00072211,00000004,00120188,00000001'

它不会更新-00000001(最后输入)的值

2 个答案:

答案 0 :(得分:2)

您可以通过以下操作将其重写为更安全,更快捷的方式:

CREATE PROC testProceduretwo @vendorIds varchar(max) AS
BEGIN

    UPDATE DS
    SET ppu_flag = 'Y'
    FROM DS_REGISTERED_VENDOR DS
         CROSS APPLY STRING_SPLIT(@vendorIds,',') SS --Assumes SQL Server 2016+
    WHERE SS.[value] = DS.Vendor_Id;
END
GO

如果您不使用SQL Server 2016,则可以使用XML Splitter或delimitedsplit8k(_lead)。快速的Google会找到这两个。

答案 1 :(得分:0)

...因为您使用charindex

set @pos = charindex(',', @vendorIds)

找到第一个逗号,然后取其前的所有内容(左):

set @vendor = left(@vendorIds, @pos-1)

最快的方法是在过程开始时手动添加逗号:

(......)
declare @pos int
set @vendorIds+=',' -- add this row
declare @vendor varchar(50)
(......)

这只是一个功能上的推理,也请考虑Larnu的警告。