TSQL - строка Split и Concat - PullRequest
       11

TSQL - строка Split и Concat

0 голосов
/ 05 июня 2019

Код:

DECLARE @ColumnNames NVARCHAR(MAX) = N'[Id],[FirstName],[LastName]' ;

Желаемый вывод:

[T1].[Id] = [T2].[Id] AND [T1].[FirstName] = [T2].[FirstName] AND [T1].[LastName] = [T2].[LastName]

Цель:

Чтобы разделить строку через запятую и превратить ее в предложение JOIN ON. Таким образом, «[Id]» превратится в «[T1]. [Id] = [T2]. [Id]» - и если будет более одного столбца (разделенный запятой), он добавит эти поля в исходном порядке. Пожалуйста, обратитесь к «Желаемому результату» для лучшего понимания. Я могу использовать STRING_SPLIT для разделения значений, но не уверен, как их заполнить так, как мне нужно ..

1 Ответ

2 голосов
/ 05 июня 2019

Это всего лишь ответ на ваш вопрос.Если я вас правильно понимаю, и вы хотите сгенерировать предложение JOIN для своего динамического оператора, у вас есть как минимум два варианта:

  • использовать STRING_SPLIT(), но если вы хотите "... добавить эти поля в исходном порядке ... ", это не вариант, поскольку порядок подстрок не гарантируется
  • преобразовать входную строку в действительный JSON и использоватьOPENJSON().

T-SQL с использованием STRING_SPLIT ():

DECLARE @ColumnNames NVARCHAR(MAX) = N'[Id],[FirstName],[LastName]'
DECLARE @join nvarchar(max) = N''
SELECT @join = STUFF(
   (
   SELECT 
      CONCAT(
         N' AND [t1].',
         s.[value],
         N'=[t2].',
         s.[value]
      )
   FROM STRING_SPLIT(@ColumnNames, N',') s
   FOR XML PATH('')
   ),
   1, 5, N'')
PRINT @join

T-SQL с использованием OPENJSON ():

DECLARE @ColumnNames NVARCHAR(MAX) = N'[Id],[FirstName],[LastName]'
DECLARE @join nvarchar(max) = N''
SELECT @join = STUFF(
   (
   SELECT 
      CONCAT(
         N' AND [t1].',
         j.[value],
         N'=[t2].',
         j.[value]
      )
   FROM OPENJSON(CONCAT(N'["', REPLACE(STRING_ESCAPE(@ColumnNames, 'json'), N',', N'","'), N'"]')) j
   ORDER BY [key]
   FOR XML PATH('')
   ),
   1, 5, N'')
PRINT @join

Вывод:

[t1].[Id]=[t2].[Id] AND [t1].[FirstName]=[t2].[FirstName] AND [t1].[LastName]=[t2].[LastName]
...