基于T-SQL遍历指定表生成新架构下的备份
遍历ETL开头表并备份至historic架构的实现方法
方法一:使用游标自动遍历执行
通过游标逐个读取目标表名,拼接动态SQL并执行备份操作:
-- 声明变量存储表名和动态SQL语句 DECLARE @table_name NVARCHAR(128) DECLARE @sql NVARCHAR(MAX) -- 定义游标,获取所有以ETL开头的表名 DECLARE table_cursor CURSOR FOR SELECT name FROM sys.tables WHERE name LIKE 'ETL%' -- 打开游标并开始遍历 OPEN table_cursor FETCH NEXT FROM table_cursor INTO @table_name WHILE @@FETCH_STATUS = 0 BEGIN -- 拼接备份SQL,处理表名的方括号转义 SET @sql = N'SELECT * INTO [historic].[' + @table_name + N'] FROM [' + @table_name + N']' -- 执行动态SQL EXEC sp_executesql @sql -- 读取下一个表名 FETCH NEXT FROM table_cursor INTO @table_name END -- 清理游标资源 CLOSE table_cursor DEALLOCATE table_cursor
方法二:批量生成备份语句手动执行
如果需要先预览所有备份语句再执行,可以生成对应的SQL脚本:
-- 生成所有表的备份语句 SELECT N'SELECT * INTO [historic].[' + name + N'] FROM [' + name + N']' AS backup_sql FROM sys.tables WHERE name LIKE 'ETL%'
执行后将结果集中的backup_sql列内容复制出来,批量执行即可。
注意事项
- 确保
historic架构已存在,若不存在需先执行:CREATE SCHEMA historic; - 执行账号需具备源表读取权限和historic架构下的建表权限
- 若目标表已存在,
SELECT INTO会报错,可在拼接SQL时添加DROP TABLE IF EXISTS [historic].[' + @table_name + N'];语句先删除旧表
内容的提问来源于stack exchange,提问作者holyshilo111
相关产品推荐
相关产品推荐

