В более поздней версии SQL Server вы можете использовать STRING_SPLIT для преобразования списка с разделителями в отдельные значения, а затем присоединиться к таблице с помощью CROSS APPLY.
CREATE PROC usp_delete @tranid VARCHAR(MAX) AS
BEGIN
DELETE c
FROM customer c
CROSS APPLY STRING_SPLIT(@tranid, ',')
WHERE c.tranid = value
END
GO
EXEC usp_delete '2,3,4'
В старой версии вы можете написать свою собственную табличную функцию для преобразования строки с разделителями в набор результатов.
CREATE function [dbo].[delimited_string_to_table] (
@delimiter char(1)
, @string text
)
returns @table table (
seqnbr int not null
, string varchar(255) not null
)
as
begin
declare @pos int
declare @textpos int
declare @chunklen smallint
declare @tmpstr varchar(8000)
declare @leftover varchar(8000)
declare @tmpval varchar(8000)
declare @seq int = 1
set @textpos = 1
set @leftover = ''
while @textpos <= datalength(@string)
begin
set @chunklen = 8000 - datalength(@leftover) / 2
set @tmpstr = @leftover + substring(@string, @textpos, @chunklen)
set @textpos = @textpos + @chunklen
set @pos = charindex(@delimiter, @tmpstr)
while @pos > 0
begin
set @tmpval = ltrim(rtrim(left(@tmpstr, @pos - 1)))
insert @table (seqnbr, string) values(@seq, @tmpval)
set @tmpstr = substring(@tmpstr, @pos + 1, len(@tmpstr))
set @pos = charindex(@delimiter, @tmpstr)
set @seq = @seq + 1
end
set @leftover = @tmpstr
end
if len(rtrim(ltrim(@leftover))) != 0
insert @table(seqnbr, string) values (@seq, ltrim(rtrim(@leftover)))
return
end
GO
Что изменит пример так:
CREATE PROC usp_delete @tranid VARCHAR(MAX) AS
BEGIN
DELETE c
FROM customer c
JOIN dbo.delimited_string_to_table(',', @tranid)
ON c.tranid = string
END
GO