根据通过字符串传递的列名创建动态 SQL

Create dynamic SQL based on column names passed through a string

我需要找出 table A 中存在但 table B 中缺失的行(使用 LEFT JOIN),其中 table A 和 table B 是两个具有相同结构但在不同架构中的 table。 但是必须使用 Dynamic SQL 构造查询,并且需要用于执行 JOIN 的列存储在字符串中。如何从字符串中提取列名并使用它们动态构造以下查询:

数据库是 Azure SQL 服务器

例如:

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

要根据 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_Split: 将输入字符串拆分成列
  • Lead: 判断在不是最后一行时我们是否需要AND关键字。

请注意 NOT EXISTS 可能是比 LEFT JOIN

更好的解决方案