Последняя запись в хранимой процедуре не обновляется - PullRequest
0 голосов
/ 11 марта 2019

Я написал ниже хранимую процедуру, она работает хорошо, однако она не обновляет последнюю запись в строке. Есть идеи почему?

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 ]

2 голосов
/ 11 марта 2019

Вы можете переписать это, чтобы сделать его намного безопаснее и быстрее, выполнив:

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 найдет любой из них.

0 голосов
/ 11 марта 2019

... Потому что вы используете charindex

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

найти первую запятую, а затем взять все, что перед ней (слева):

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

Самый быстрый способ - добавить запятую вручную при запуске процедуры:

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

Это всего лишь функциональное рассуждение, учтите и предупреждения Ларну.

...