如何将数据从 SQL table 导出到 SSIS 中的多个 excel 文件?
How to export data from SQL table to multiple excel files in SSIS?
我创建了一个 SSIS 包,它从 SQL 中提取数据并将其加载到 excel 中。我在使这个包动态化并将数据加载到多个 excel 文件中时遇到问题。
我首先创建了一个 execute SQL 任务,它保存所有带有 SQL 代码的文件名: SELECT FileName FROM Files
其结果集将存储在变量 FileNameObj
中.然后我创建了一个 Foreach Loop Container 并在里面添加了一个 Data Flow Task。
Foreach 循环容器设置: Foreach ADO 枚举器、ADO 对象源变量 - FileNameObj
、变量映射 - FileName
和索引 - 0。数据下流任务,我添加了一个 OLE DB 源和 Excel 指向文件路径的目标: C:\Test\ABC.xlsx
。
这里是连接管理器属性:
ConnectionString: Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\ABC.xlsx;Extended Properties="Excel 12.0;HDR=YES";
DelayValidation 设置为 True
Excel文件路径 是 C:\Test\ABC.xlsx
然后我用 属性 ExcelFilePath
和表达式创建了一个表达式: "C:\Test\"+ @[User::FileName]+".xlsx"
然后我的 ConnectionString 更改为: Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\.xlsx;Extended Properties="Excel 12.0;HDR=YES";
我已经在测试文件夹中创建了所有文件模板(所有文件的结构相同)。我收到以下错误:
Error at Data Flow Task [Excel Destination [131]]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E37.
Error at Data Flow Task [Excel Destination [131]]: Opening a rowset for "Sheet1$" failed. Check that the object exists in the database.
Exception from HRESULT: 0xC02020E8 (Microsoft.SqlServer.DTSPipelineWrap)
我做错了什么?或者甚至可以在 SSIS 中执行此操作?
看这里:Dynamically assign filename to excel connection string
使用ExcelFilePath
,而不是ConnectionString
澄清一下:
- 如果您将具有相同列的相同数据加载到多个 excel sheet 中,只需导出一次并在文档上进行文件复制会容易得多
如果每个 sheet 都有不同的列,那么这将不起作用 - 每个数据流在每次运行时都需要有相同的列
如果您要加载相同的列但过滤后的数据不同,那么您可能需要考虑这样做的原因。是否要克服 excel 中的行限制?如果是这样,请改为导出为 CSV。是否为用户生成自定义报告?考虑改用报告工具。
动态Excel连接字符串
首先,.XLSX
格式的 excel 连接字符串如下所示:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\"+ @[User::FileName]+ ".xlsx; Extended Properties=\"Excel 12.0 Xml;HDR=YES\";"
而推荐的方式是(@Nick.McDermaid提到的),将值赋给ExcelFilePath
属性
但是你必须考虑很多其他的事情:
- 所有 excel 文件必须具有相同的结构,否则此包将始终失败。
- 将数据流任务
Delay Validation
属性 设置为 True
参考资料
更新 1
许多你应该尝试的事情:
- 安装 Access 数据库引擎
下载Link:Microsoft Access Database Engine 2010 Redistributable
- 运行 32 位模式包
在项目属性中,将 64 位 运行时间 属性 更改为 False
检查 Sheet1
是否存在于所有模板中
为 filepath
变量分配默认值
我找到了解决我自己问题的方法:为 FileName
变量分配一个默认值。我分配了 ABC
并且它起作用了。按预期生成两个文件,一个用于 ABC,一个用于 DEF。
我创建了一个 SSIS 包,它从 SQL 中提取数据并将其加载到 excel 中。我在使这个包动态化并将数据加载到多个 excel 文件中时遇到问题。
我首先创建了一个 execute SQL 任务,它保存所有带有 SQL 代码的文件名: SELECT FileName FROM Files
其结果集将存储在变量 FileNameObj
中.然后我创建了一个 Foreach Loop Container 并在里面添加了一个 Data Flow Task。
Foreach 循环容器设置: Foreach ADO 枚举器、ADO 对象源变量 - FileNameObj
、变量映射 - FileName
和索引 - 0。数据下流任务,我添加了一个 OLE DB 源和 Excel 指向文件路径的目标: C:\Test\ABC.xlsx
。
这里是连接管理器属性:
ConnectionString: Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\ABC.xlsx;Extended Properties="Excel 12.0;HDR=YES";
DelayValidation 设置为 True
Excel文件路径 是 C:\Test\ABC.xlsx
然后我用 属性 ExcelFilePath
和表达式创建了一个表达式: "C:\Test\"+ @[User::FileName]+".xlsx"
然后我的 ConnectionString 更改为: Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\.xlsx;Extended Properties="Excel 12.0;HDR=YES";
我已经在测试文件夹中创建了所有文件模板(所有文件的结构相同)。我收到以下错误:
Error at Data Flow Task [Excel Destination [131]]: SSIS Error Code DTS_E_OLEDBERROR. An OLE DB error has occurred. Error code: 0x80040E37.
Error at Data Flow Task [Excel Destination [131]]: Opening a rowset for "Sheet1$" failed. Check that the object exists in the database.
Exception from HRESULT: 0xC02020E8 (Microsoft.SqlServer.DTSPipelineWrap)
我做错了什么?或者甚至可以在 SSIS 中执行此操作?
看这里:Dynamically assign filename to excel connection string
使用ExcelFilePath
,而不是ConnectionString
澄清一下:
- 如果您将具有相同列的相同数据加载到多个 excel sheet 中,只需导出一次并在文档上进行文件复制会容易得多
如果每个 sheet 都有不同的列,那么这将不起作用 - 每个数据流在每次运行时都需要有相同的列
如果您要加载相同的列但过滤后的数据不同,那么您可能需要考虑这样做的原因。是否要克服 excel 中的行限制?如果是这样,请改为导出为 CSV。是否为用户生成自定义报告?考虑改用报告工具。
动态Excel连接字符串
首先,.XLSX
格式的 excel 连接字符串如下所示:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\"+ @[User::FileName]+ ".xlsx; Extended Properties=\"Excel 12.0 Xml;HDR=YES\";"
而推荐的方式是(@Nick.McDermaid提到的),将值赋给ExcelFilePath
属性
但是你必须考虑很多其他的事情:
- 所有 excel 文件必须具有相同的结构,否则此包将始终失败。
- 将数据流任务
Delay Validation
属性 设置为True
参考资料
更新 1
许多你应该尝试的事情:
- 安装 Access 数据库引擎
下载Link:Microsoft Access Database Engine 2010 Redistributable
- 运行 32 位模式包
在项目属性中,将 64 位 运行时间 属性 更改为 False
检查
Sheet1
是否存在于所有模板中为
filepath
变量分配默认值
我找到了解决我自己问题的方法:为 FileName
变量分配一个默认值。我分配了 ABC
并且它起作用了。按预期生成两个文件,一个用于 ABC,一个用于 DEF。