首页 > 解决方案 > 根据通过字符串传递的列名创建动态 SQL

问题描述

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

数据库是 Azure SQL Server

例如:

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 语句需要满足所有列。

标签: joinazure-sql-databaseleft-joindynamic-sql

解决方案


在不知道完整上下文的情况下,试试这个:

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:将输入字符串拆分为列
  • LeadAND :当关键字不是最后一行时,确定我们是否需要关键字。

请注意,这NOT EXISTS可能是一个更好的解决方案LEFT JOIN


推荐阅读