根据通过字符串传递的列名创建动态 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
更好的解决方案
我需要找出 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