代码:
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拆分值,但不确定如何按照我需要的方式填充它们。
答案 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]