Join 基于通过字符串传递的列名创建动态SQL

Join 基于通过字符串传递的列名创建动态SQL,join,azure-sql-database,left-join,dynamic-sql,Join,Azure Sql Database,Left Join,Dynamic Sql,我需要使用左连接找出表A中存在的行和表B中缺少的行,其中表A和表B是两个结构相同但模式不同的表。 但是查询必须使用动态SQL构造,并且执行联接所需的列存储在字符串中。如何从字符串中提取列名并使用它们动态构造以下查询: 数据库是Azure SQL Server 例如: 基于ColNames中定义的列构造的查询:- SELECT * FROM Table A Left Join Table B ON A.col1 = B.col1 AND A.col2 = B.col2 AND B.col1 IS

我需要使用左连接找出表A中存在的行和表B中缺少的行,其中表A和表B是两个结构相同但模式不同的表。 但是查询必须使用动态SQL构造,并且执行联接所需的列存储在字符串中。如何从字符串中提取列名并使用它们动态构造以下查询:

数据库是Azure SQL Server

例如:

基于ColNames中定义的列构造的查询:-

SELECT *
FROM Table A
Left Join
Table B
ON A.col1 = B.col1
AND A.col2 = B.col2
AND B.col1 IS NULL AND B.col2 IS NULL

如果@ColNames中的列数大于SELECT语句需要满足所有列的要求。

在不了解完整上下文的情况下,请尝试以下操作:

DECLARE @ColNames NVARCHAR(150) = 'col1,col2'
DECLARE @JoinContion NVARCHAR(MAX) = ''
DECLARE @WhereCondition NVARCHAR(MAX) = ''

SELECT @JoinContion += CONCAT('[a].', QUOTENAME(Value), ' = ', '[b].', QUOTENAME(Value), (CASE WHEN LEAD(Value) OVER(ORDER BY Value) IS NOT NULL THEN ' AND ' ELSE '' END))
    ,@WhereCondition += CONCAT('[a].', QUOTENAME(Value), ' IS NULL', (CASE WHEN LEAD(Value) OVER(ORDER BY Value) IS NOT NULL THEN ' AND ' ELSE '' END))
FROM STRING_SPLIT(@ColNames,N',')

SELECT @JoinContion, @WhereCondition
String\u Split:将输入字符串拆分为列 Lead:确定在不是最后一行时是否需要AND关键字。
请注意,NOT EXISTS可能是比LEFT JOIN更好的解决方案

我使用的是Azure SQL Server。您能否提供动态SQL当前的构建方式?桌子是从哪里来的?为什么使用left join而不是not exists?我也可以使用not exists,但是相关子查询需要为字符串变量中存在的所有列匹配列值,例如:Select*from Table A Where not exists Select 1 from TableB.Col1=TableA.Col1和TableB.Col2=TableA.Col2
DECLARE @ColNames NVARCHAR(150) = 'col1,col2'
DECLARE @JoinContion NVARCHAR(MAX) = ''
DECLARE @WhereCondition NVARCHAR(MAX) = ''

SELECT @JoinContion += CONCAT('[a].', QUOTENAME(Value), ' = ', '[b].', QUOTENAME(Value), (CASE WHEN LEAD(Value) OVER(ORDER BY Value) IS NOT NULL THEN ' AND ' ELSE '' END))
    ,@WhereCondition += CONCAT('[a].', QUOTENAME(Value), ' IS NULL', (CASE WHEN LEAD(Value) OVER(ORDER BY Value) IS NOT NULL THEN ' AND ' ELSE '' END))
FROM STRING_SPLIT(@ColNames,N',')

SELECT @JoinContion, @WhereCondition