如何从SQL Server 240张表中提取objectID列合并为单表?
合并多表objectID列的解决方案
动态SQL批量生成查询(推荐用于240张表)
手动写240个表的UNION ALL效率太低,用动态SQL自动生成语句是最优方案:
1. 先确认所有目标表都存在objectID列
避免后续执行时报错,先排查缺失该列的表:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME NOT LIKE '%(xx)%' AND TABLE_NAME NOT LIKE '%archive%' GROUP BY TABLE_NAME HAVING SUM(CASE WHEN COLUMN_NAME = 'objectID' THEN 1 ELSE 0 END) = 0
如果查询无返回结果,说明所有目标表都包含objectID列,可继续下一步。
2. 生成并执行合并SQL
运行以下脚本会自动生成合并所有表objectID的语句,并将结果存入新表:
DECLARE @sql NVARCHAR(MAX) = '' -- 拼接所有表的查询语句 SELECT @sql = @sql + 'SELECT objectID, ''' + TABLE_NAME + ''' AS source_table FROM ' + QUOTENAME(TABLE_NAME) + ' UNION ALL ' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME NOT LIKE '%(xx)%' AND TABLE_NAME NOT LIKE '%archive%' AND COLUMN_NAME = 'objectID' GROUP BY TABLE_NAME -- 移除末尾多余的UNION ALL SET @sql = LEFT(@sql, LEN(@sql) - 10) -- 将结果插入到新表(可修改表名merged_objectID_table为你需要的名称) SET @sql = 'SELECT * INTO merged_objectID_table FROM (' + @sql + ') AS union_result' -- 执行生成的SQL EXEC sp_executesql @sql
其中source_table列用于标记每条数据的来源表,方便后续追溯。
手动编写UNION ALL(不推荐用于240张表)
如果是少量表可以手动拼接,但240张表不建议这么操作,示例如下:
SELECT objectID, 'table_name_1' AS source_table FROM table_name_1 UNION ALL SELECT objectID, 'table_name_2' AS source_table FROM table_name_2 -- 依次添加其余所有表的查询语句
内容的提问来源于stack exchange,提问作者Maxcot
相关产品推荐
相关产品推荐

