#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. Это должно быть обработано тем, что создает разделенную строку. Вы могли бы использовать канал
|
для разделения, поскольку это также менее вероятно, но проблему с одинарными кавычками / апострофом все равно придется решать.