繁体   English   中英

TSQL-拆分和Concat字符串

[英]TSQL - Split and Concat string

码:

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拆分值,但不确定如何按照我的方式填充它们。

这只是您问题的答案。 如果我对您的理解正确,并且想为动态语句生成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]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM