如何在Azure Synapse中用动态SQL循环查询多表最大loaddate
批量查询多表最大LoadDate值的解决方案
这里提供两种实用的实现方式,帮你一次性处理多个表的查询需求:
方法1:表变量+循环遍历执行
这种方式会逐个查询每个表,同时返回表名和对应的最大LoadDate,结果更直观易区分:
-- 声明存储表名的表变量 DECLARE @Tables TABLE (TableName VARCHAR(200)) -- 插入需要查询的表名列表 INSERT INTO @Tables VALUES ('TableA'), ('TableB'), ('TableC'), ('TableD') -- 声明循环用变量 DECLARE @CurrentTable VARCHAR(200) DECLARE @SQLStmnt VARCHAR(MAX) -- 游标遍历表名列表 DECLARE TableCursor CURSOR FOR SELECT TableName FROM @Tables OPEN TableCursor FETCH NEXT FROM TableCursor INTO @CurrentTable WHILE @@FETCH_STATUS = 0 BEGIN -- 拼接动态SQL,同时返回表名便于区分结果 SET @SQLStmnt = 'SELECT ''' + @CurrentTable + ''' AS TableName, MAX(loaddate) AS MaxLoadDate FROM ' + QUOTENAME(@CurrentTable) EXEC (@SQLStmnt) FETCH NEXT FROM TableCursor INTO @CurrentTable END CLOSE TableCursor DEALLOCATE TableCursor
方法2:拼接UNION ALL语句一次性执行
这种方式会把所有表的查询逻辑拼接成单条SQL语句,一次性返回所有结果,执行效率更高:
DECLARE @SQLStmnt VARCHAR(MAX) = '' DECLARE @Tables TABLE (TableName VARCHAR(200)) INSERT INTO @Tables VALUES ('TableA'), ('TableB'), ('TableC'), ('TableD') -- 拼接UNION ALL查询语句 SELECT @SQLStmnt = @SQLStmnt + 'SELECT ''' + TableName + ''' AS TableName, MAX(loaddate) AS MaxLoadDate FROM ' + QUOTENAME(TableName) + ' UNION ALL ' FROM @Tables -- 移除末尾多余的UNION ALL SET @SQLStmnt = LEFT(@SQLStmnt, LEN(@SQLStmnt) - 10) -- 执行拼接完成的SQL EXEC (@SQLStmnt)
注意事项
- 使用
QUOTENAME()函数包裹表名,可避免表名含特殊字符(如空格、关键字)导致的语法错误,同时能降低SQL注入风险。 - 若表属于特定架构(如
dbo.TableA),需在表名中添加架构前缀,或在拼接SQL时统一补充。
内容的提问来源于stack exchange,提问作者LearneR
相关产品推荐
相关产品推荐

