我在下面编写了存储过程,它运行良好,但是,它不会更新字符串中的最后一个条目。有什么想法吗?
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(最后输入)的值
答案 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的警告。