TSQL-拆分和Concat字符串

时间:2019-06-05 18:59:42

标签: sql sql-server tsql sql-server-2016

代码:

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 个答案:

答案 0 :(得分:2)

这只是您问题的答案。如果我对您的理解正确,并且想为动态语句生成一个JOIN子句,则至少有两个选择:

  • 使用STRING_SPLIT(),但如果要“ ...以原始顺序附加这些字段...” ,则此选项不可行,因为子字符串的顺序不保证
  • 将输入字符串转换为有效的JSON并使用OPENJSON()

使用STRING_SPLIT()的T-SQL:

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

使用OPENJSON()的T-SQL:

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]