Передача строки значений через запятую в пользовательскую функцию - PullRequest
1 голос
/ 16 мая 2011

В TSQL (SQL SERVER 2008), как бы я передавал разделенный запятыми список строковых значений, например. «золото, серебро, медь» для пользовательской функции, которая задает параметр varchar.

Я понимаю, что если я определю параметр varchar в моем UDF, скажем @commodityList, который занимает список «золото, серебро, медь», я не могу использовать оператор IN. т.е.

SELECT * FROM Prodn where commodity in (@commodList).

Я прочитал несколько статей о подходе с использованием табличных значений параметров, однако я считаю, что переход по этому пути будет означать разбиение моей строки на куски - для вставки в табличный параметр, например:

DECLARE @mylist commodity_list_tbltype

INSERT @mylist VALUES('gold'),('silver'),('copper')

Мне интересно, существует ли прямой подход для установки строкового аргумента в том виде, как он есть, и использования оператора SQL IN в UDF.

Приветствие.

1 Ответ

2 голосов
/ 16 мая 2011

Вы можете создать функцию udf для спинга в таблицу

CREATE FUNCTION [dbo].[fn_ado_param] (@ado nvarchar(4000), @Delim char(1)= ',')
RETURNS @VALUES TABLE (ado nvarchar(4000))AS
   BEGIN
   DECLARE @chrind INT
   DECLARE @Piece nvarchar(4000)
   SELECT @chrind = 1
   WHILE @chrind > 0
      BEGIN
         SELECT @chrind = CHARINDEX(@Delim,@ado)
         IF @chrind > 0
            SELECT @Piece = LEFT(@ado,@chrind - 1)
         ELSE
            SELECT @Piece = @ado
         INSERT @VALUES(ado) VALUES(@Piece)
         SELECT @ado = RIGHT(@ado,LEN(@ado) - @chrind)
         IF LEN(@ado) = 0 BREAK
      END
   RETURN
END

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

select * from dbo.fn_ado_param('gold,silver,copper',',')

или в других элементах

select * from anytable where somefield in (select * from dbo.fn_ado_param('gold,silver,copper',','))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...