如何用For Each循环将多张SQL表导入SSIS并分别导出为TXT文件
用SSIS For Each循环批量导出SQL表为独立TXT文件
1. 先搞定待导出表的清单
- 先在SQL Server里建个表存要导出的表名,灵活度高,后续改起来方便:
CREATE TABLE dbo.ExportTablesList ( TableID INT IDENTITY(1,1) PRIMARY KEY, SchemaName NVARCHAR(128) NOT NULL DEFAULT 'dbo', TableName NVARCHAR(128) NOT NULL ); -- 把你要导出的10张表插进去 INSERT INTO dbo.ExportTablesList (SchemaName, TableName) VALUES ('dbo','Table1'),('dbo','Table2'),('dbo','Table3'), ('dbo','Table4'),('dbo','Table5'),('dbo','Table6'), ('dbo','Table7'),('dbo','Table8'),('dbo','Table9'), ('dbo','Table10');
- 嫌建表麻烦?直接用系统视图筛选也行:
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME IN ('Table1','Table2',...,'Table10'),但自定义表更可控。
2. 配置For Each循环的枚举器
- 打开SSIS包,在控制流里拖个For Each循环容器进来。
- 双击容器,切到「集合」标签:
- 枚举器选「Foreach ADO枚举器」
- 点「ADO对象源变量」旁边的「新建」,建个Object类型的变量(比如叫
User::ExportTables) - 点「配置」,选「SQL命令」,输入查询语句拉取表清单:
SELECT SchemaName, TableName FROM dbo.ExportTablesList; - 选好你的SQL连接管理器,确定后这个变量就存了所有要导出的表信息。
- 勾上「遍历整个集合」,枚举模式选「第一行中的每一列」。
3. 把枚举值映射到变量
- 切到「变量映射」标签:
- 建两个字符串变量:
User::CurrentSchema(存表的架构名)、User::CurrentTable(存表名) - 索引0对应
User::CurrentSchema,索引1对应User::CurrentTable——这样每次循环都会把当前表的架构和名称塞到这俩变量里。
- 建两个字符串变量:
4. 配置数据流任务(核心操作)
- 在For Each循环容器里拖个数据流任务。
- 打开数据流面板:
4.1 动态读取SQL表
- 拖个「OLE DB源」,双击打开:
- 选好你的SQL连接管理器
- 数据访问模式选「SQL命令」,要么用参数化查询:
然后点「参数」,把第一个参数绑SELECT * FROM ?.?";User::CurrentSchema,第二个绑User::CurrentTable; - 要么直接用表达式写SQL:在OLE DB源的「表达式」属性里,把
[SQLCommand]设成:"SELECT * FROM " + @[User::CurrentSchema] + "." + @[User::CurrentTable]
4.2 动态导出到TXT
- 拖个「平面文件目标」,连好OLE DB源的输出线。
- 先建个平面文件连接管理器:随便指定个临时TXT路径(比如
C:\Temp\Temp.txt),把格式(分隔符、编码、是否带表头这些)调好。 - 然后给这个连接管理器加表达式:在属性里找到
[ConnectionString],设成:
("C:\Export\\" + @[User::CurrentTable] + ".txt"C:\Export\是你要导出的文件夹,提前建好,或者加个任务自动建) - 回到平面文件目标,选这个连接管理器,点「映射」确认列对应没问题。
- 拖个「OLE DB源」,双击打开:
5. 可选优化
- 怕文件夹不存在报错?在控制流里加个「执行SQL任务」,放在For Each循环前面,执行:
EXEC xp_create_subdir 'C:\Export\'; - 要动态改分隔符、编码?给平面文件连接管理器的对应属性加表达式就行。
6. 跑起来测试
- 保存包,点运行,循环会自动遍历每一张表,导出成单独的TXT文件。
内容的提问来源于stack exchange,提问作者Ganesh
相关产品推荐
相关产品推荐

