SQL Server split string встроенная функция против старого стиля TVF для разделения строки с помощью SSRS

#sql #sql-server #reporting-services

#sql #sql-сервер #службы отчетов

Вопрос:

У меня есть следующая Split функция, которая некоторое время использовалась в сочетании с многозначными параметрами, используемыми для отчетов SSRS.

 CREATE FUNCTION [dbo].[FnSplit]
     (@List NVARCHAR(MAX),
      @SplitOn NVARCHAR(5))  
RETURNS @RtnValue TABLE 
                  (
                       Id INT IDENTITY(1,1),
                       Value NVARCHAR(100)
                  ) 
AS  
BEGIN
    WHILE (CHARINDEX(@SplitOn, @List) > 0)
    BEGIN 
        INSERT INTO @RtnValue (value)
            SELECT
                Value = LTRIM(RTRIM(SUBSTRING(@List, 1, CHARINDEX(@SplitOn, @List) - 1))) 
        SET @List = SUBSTRING(@List, CHARINDEX(@SplitOn, @List)   LEN(@SplitOn), LEN(@List))
    END 

    INSERT INTO @RtnValue (Value)
        SELECT Value = LTRIM(RTRIM(@List))

    RETURN
END
 

Этот метод несколько громоздкий, но я заметил, что с тех пор, как мы обновили нашу версию SQL Server, мы на нем теперь поддерживаем String_Split встроенную функцию.

Мой вопрос для всех, кто знает, кто использовал это: можно ли использовать это для полной замены функции, показанной выше, для многозначных параметров?

Заранее благодарю вас

Комментарии:

1. String_Split() имеет один недостаток … он не определяет последовательность. Кроме того, по возможности следует избегать зацикливания.

2. Привет, спасибо, есть ли лучший способ, чем тот, который я использовал выше, а также тот, который позволил бы избежать зацикливания? Я полагаю, что порядок важен с точки зрения конечного пользователя, если все в алфавитном порядке. Есть ли способ сделать это по порядку, используя String_Split() и как-то упорядочить его?

3. Смотрите Пример ниже

Ответ №1:

Если 2016 , мне нравится подход JSON. Если не 2016 … также существует подход XML.

Пример

 Select * from [dbo].[tvf-Str-Parse-JSON]('Dog,Cat,House,Car',',')
 

ВОЗВРАТ

 RetSeq  RetVal
1       Dog
2       Cat
3       House
4       Car
 

TVF, если интересно

 CREATE FUNCTION [dbo].[tvf-Str-Parse-JSON] (@String varchar(max),@Delimiter varchar(10))
Returns Table 
As
Return (  
    Select RetSeq = [Key] 1
          ,RetVal = Value
     From  OpenJSON( '["' replace(replace(@String,'"','"'),@Delimiter,'","') '"]' )
);
 

Комментарии:

1. Спасибо, Джон, мне нужно будет поиграть с тем, что вы отправили, никогда не использовал JSON в SQL, поэтому должно быть интересно. Итак, правильно ли я предполагаю, что мне все равно нужно будет использовать TVF, особенно если я хочу упорядочить список в параметрах? Невозможно обойтись без использования TFV с использованием только String_Split ? Ваше решение выше выглядит хорошо, поскольку оно устраняет использование цикла 🙂

2. @abs786123 string_split() — это TVF. Если вас не волнует последовательность, то string_split() — это правильный путь.

Ответ №2:

Простой, но должен выполнять свою работу

 DECLARE @list varchar(max) = 'john, bob, dave'

SELECT txt
    FROM (SELECT ltrim(rtrim([Value])) as txt from string_split(@list, ',')) s 
    ORDER BY txt
 

ВОЗВРАТ

введите описание изображения здесь

Комментарии:

1. Большое вам спасибо, ребята, я немного отклоняюсь от основного вопроса, но если бы в имени типа O’Hare была одинарная кавычка, можно ли это использовать, чтобы позаботиться об этом, поскольку имена добавляются все время, и я не буду мудрее? Спасибо

2. Это должно быть обработано тем, что создает разделенную строку. Вы могли бы использовать канал | для разделения, поскольку это также менее вероятно, но проблему с одинарными кавычками / апострофом все равно придется решать.