Объединить результаты столбца string_split в таблицу SQL - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь создать хранимую процедуру для обновления таблицы в пакете.Я хочу принять параметры как nvarchar и вызвать string_split для них.

@ParamList1 NVARCHAR(max) = '1,2,3,4,5'
@ParamList2 NVARCHAR(max) = 'a,b,c,d,e'

Я хочу получить временную таблицу типа

Param1  Param2
1       a
2       b
3       c
...

Как мне это сделать

Ответы [ 2 ]

2 голосов
/ 21 сентября 2019

К сожалению, string_split() не гарантирует упорядочение или предоставление аргумента позиции (Microsoft слушает?).

Итак, самый безопасный метод - это рекурсивный CTE (или, возможно, другой подход, использующий XML):

with cte as (
      select convert(nvarchar(max), NULL) as x1, convert(nvarchar(max), NULL) as x2, @paramlist1 as rest1, @paramlist2 as rest2, 1 as lev
      union all
      select convert(nvarchar(max), left(rest1, charindex(',', rest1 + ',') - 1)),
             convert(nvarchar(max), left(rest2, charindex(',', rest2 + ',') - 1)),
             stuff(rest1, 1, charindex(',', rest1 + ','), ''),
             stuff(rest2, 1, charindex(',', rest2 + ','), ''),
             lev + 1
      from cte
      where rest1 <> '' and rest2 <> ''
     )
select *
from cte
where x1 is not null;

Здесь - это дб <> скрипка.

0 голосов
/ 22 сентября 2019

У вас уже есть ответ, который работает нормально, но это должно быть быстрее и проще:

Вы не указали версию своего SQL-сервера, но - говорите о STRING_SPLIT() - я предполагаюэто как минимум v2016.Если это правильно, вы можете использовать OPENJSON.Ваш список чисел не должен содержать ничего, кроме скобок, чтобы быть JSON-массивом ([1,2,3]), в то время как массив слов / букв может быть преобразован с помощью некоторых простых строковых операций (["a","b","c"]).

Послеdocs, OPENJSON возвращает положение элементов в [key], а сам элемент возвращается в [value].Вы можете просто присоединиться к этим наборам:

DECLARE @ParamList1 NVARCHAR(max) = '1,2,3,4,5';
DECLARE @ParamList2 NVARCHAR(max) = 'a,b,c,d,e';

SELECT p1.[key] AS FragmentNr
      ,p1.[value] AS P1
      ,p2.[value] AS P2
FROM OPENJSON(CONCAT('[',@ParamList1 + ']')) p1
INNER JOIN OPENJSON(CONCAT('["',REPLACE(@ParamList2,',','","'),'"]')) p2 ON p1.[key]=p2.[key] ;

В этом ответе вы найдете некоторые детали (ОБНОВЛЕНИЕ раздел 1 и 2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...