Объединить результаты операций string_split и обновить таблицу

#sql-server #split #resultset

#sql-сервер #разделить #набор результатов

Вопрос:

У меня есть таблица с 3 столбцами: col1, col2, col3. Мне нужно вставить строки в эту таблицу, и мои входные данные — это 3 параметра, один параметр int и два параметра varchar, которые мне нужно разделить. Так, например

 @param1 = 1    
@param2 = '2,3'
@param3 = '4,5'
  

должны быть созданы следующие строки

 1,2,4
1,3,5
  

Я попытался приблизиться к желаемому результату с помощью такого кода

 WITH group1 AS (
  SELECT @param1 as col1, value as col2 from string_split(@param2,',')
),
group2 AS (
  SELECT @param1 as col1, value as col3 from string_split(@param3,',') 
)
SELECT group1.col1, group1.col2, group2.col3
  FROM group1
  JOIN group2 ON group1.col1 = group2.col1 
  

но это не совсем то, что я хочу.

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

1. Есть @param2 и @param3 всегда иметь 2 подстроки?

2. нет, у них может быть много и всегда одинаковое количество подстрок

3. какую версию sql-сервера вы используете?

Ответ №1:

Вам нужен разделитель, который возвращает каждую подстроку и позицию подстроки. Иногда может помочь подход, основанный на JSON. Вам необходимо преобразовать строки, разделенные запятыми, в допустимые массивы JSON ( 2,3 into [2,3] ), проанализировать массивы с OPENJSON() помощью и использовать соответствующий JOIN :

 DECLARE @param1 int = 1    
DECLARE @param2 varchar(100) = '2,3,6,8'
DECLARE @param3 varchar(100) = '4,5,9,5'

-- INSERT INTO Table1 (Column1, Column2, Column3)
SELECT 
   @param1 AS Column1,
   j1.[value] AS Column2, 
   j2.[value] AS Column3
FROM OPENJSON (CONCAT('[', @param2, ']')) j1
FULL JOIN OPENJSON (CONCAT('[', @param3, ']')) j2 ON j1.[key] = j2.[key]
  

Результат:

 Column1 Column2 Column3
1       2       4
1       3       5
1       6       9
1       8       5
  

В качестве важного примечания (хотя STRING_SPLIT() строка разбивается на строки и возвращает таблицу), как указано в документации, выходные строки могут располагаться в любом порядке, и порядок не гарантируется, чтобы соответствовать порядку подстрок во входной строке.

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

1. О нет, тогда я не могу использовать string_split в моем сценарии. Есть ли какая-либо другая встроенная функция, такая как string_split, или мне нужно создать свою собственную?

2. @KonstantinosPapakonstantinou Здесь много примеров о том, как разделить строку. И да, вам нужно использовать существующую или создать свою собственную функцию.