Thread: MS SQL Server General Questions/Процедура для работы со списком string элементов

Процедура для работы со списком string элементов
Процедура для работы со списком 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 в таблицу.