使用动态SQL来拼接重复的UNION ALL查询语句

dba 发布于 2023-12-26 阅读(57)

在SQL Server中,您可以使用动态SQL来优化这种重复的UNION ALL查询。这种方法可以使用一个循环来生成所有必要的SELECT语句,而不需要手动为每个月份编写单独的查询。这种方式不仅可以减少编码工作量,还可以提高代码的可维护性。

以下是一个使用T-SQL编写的示例,展示了如何动态生成并执行您的查询:
这段代码首先声明了一个循环,从2014年3月开始,一直到2023年9月。在每次迭代中,它构建一个表名,然后生成相应的SELECT语句,并将它们添加到一个动态SQL语句中。最后,使用sp_executesql执行生成的SQL语句。

请注意,动态SQL在使用时应谨慎处理,特别是在涉及用户输入的情况下,以避免SQL注入风险。在您的案例中,由于表名和条件是硬编码的,风险较低。但在其他情况下,请确保采取适当的预防措施。

DECLARE @sql NVARCHAR(MAX) = '';
DECLARE @startDate DATE = '20140301'; -- 开始日期
DECLARE @endDate DATE = '20230901';   -- 结束日期

WHILE @startDate <= @endDate
BEGIN
    -- 构建表名
    DECLARE @tableName NVARCHAR(50);
    SET @tableName = 'gc_chain_month_summary_dtl_' + REPLACE(LEFT(CONVERT(VARCHAR, @startDate, 112), 6), '-', '');

    -- 构建并添加查询
    SET @sql += 'SELECT HOTEL_CODE, PERIOD_MONTH, COL2, COL15 FROM ' + @tableName + 
                ' WHERE HOTEL_CODE = ''120843'' AND PARSE_UNIT_CODE = ''U001'' ';

    -- 如果不是最后一个月份,添加UNION ALL
    IF @startDate < @endDate
    BEGIN
        SET @sql += 'UNION ALL ';
    END

    -- 移动到下一个月
    SET @startDate = DATEADD(MONTH, 1, @startDate);
END

-- 执行生成的SQL语句
EXEC sp_executesql @sql;