Процедура для работы со списком string элементов
Данная процедура заполняет временную таблицу #strings:
CREATE PROCEDURE charlist_to_table_sp
@list ntext,
@delimiter char(1) = N',' AS
DECLARE @pos int,
@textpos int,
@chunklen smallint,
@tmpstr nvarchar(4000),
@leftover nvarchar(4000),
@tmpval nvarchar(4000),
@sql nvarchar(4000)
SET NOCOUNT ON
SELECT @textpos = 1, @leftover = ''
WHILE @textpos <= datalength(@list) / 2
BEGIN
SELECT @chunklen = 4000 - datalength(@leftover) / 2
SELECT @tmpstr = @leftover + substring(@list, @textpos, @chunklen)
SELECT @textpos = @textpos + @chunklen
SELECT @pos = charindex(@delimiter, @tmpstr)
WHILE @pos > 0
BEGIN
SELECT @tmpval = left(@tmpstr, charindex(@delimiter, @tmpstr) - 1)
SELECT @tmpval = ltrim(rtrim(@tmpval))
INSERT #strings(str) VALUES (@tmpval)
SELECT @tmpstr = substring(@tmpstr, @pos + 1, len(@tmpstr))
SELECT @pos = charindex(@delimiter, @tmpstr)
END
SELECT @leftover = @tmpstr
END
INSERT #strings(str) VALUES(ltrim(rtrim(@leftover)))
Вот пример использования этой процедуры:
CREATE PROCEDURE get_company_names_iterproc @customerids nvarchar(2000) AS
CREATE TABLE #strings (str nchar(10) NOT NULL)
EXEC charlist_to_table_sp @customerids
SELECT C.CustomerID, C.CompanyName
FROM Northwind..Customers C
JOIN #strings s ON C.CustomerID = s.str
go
EXEC get_company_names_iterproc 'ALFKI, BONAP, CACTU, FRANK'
Функция, разбирающая список string элементов, возвращала таблицу из двух полей - varchar и nvarchar. В случае с процедурой нет веской причины делать тоже самое. Пользователь процедуры сам определяет тип данных, с которыми он работает. По той же причине процедура не создает поле listpos. Если Вы хотите знать номер элемента в списке, то Вы можете добавить поле IDENTITY в таблицу.