我创建了一个SSIS包,它从SQL中提取数据并将其加载到excel中。我有问题使这个包动态化并将数据加载到多个excel文件中。
我首先创建了一个执行SQL任务,该任务包含所有带有SQL代码的文件名:SELECT FileName FROM Files
,其结果集将存储在变量FileNameObj
中。然后我创建了一个Foreach循环容器并在里面添加了一个数据流任务。
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
ExcelFilePath 是C:\Test\ABC.xlsx
然后我创建了一个包含Property ExcelFilePath
和Expression:"C:\\Test\\"+ @[User::FileName]+".xlsx"
的表达式
然后我的 ConnectionString 更改为:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\.xlsx;Extended Properties="Excel 12.0;HDR=YES";
我已经在测试文件夹中创建了所有文件模板(所有文件都相同)。我收到以下错误:
数据流任务错误[Excel目标[131]]:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80040E37。
数据流任务时出错[Excel目的地[131]]:打开" Sheet1 $"的行集。失败。检查数据库中是否存在该对象。
HRESULT的异常:0xC02020E8(Microsoft.SqlServer.DTSPipelineWrap)
我做错了什么?或者甚至可以在SSIS中执行此操作?
答案 0 :(得分:2)
见这里:Dynamically assign filename to excel connection string
使用ExcelFilePath
,而不是ConnectionString
只是为了澄清:
如果每个工作表都有不同的列,那么这不会起作用 - 每次运行时,每个数据流都需要具有相同的列
如果您要加载相同的列但不同的过滤数据,那么您可能需要考虑为什么要这样做。是否要克服excel中的行限制?如果是这样,请导出为CSV。它是否为用户生成自定义报告?请考虑使用报告工具。
答案 1 :(得分:1)
你应该尝试很多事情:
下载链接:Microsoft Access Database Engine 2010 Redistributable
在“项目”属性中,将64位运行时属性更改为False
检查所有模板中是否存在Sheet1
为文件路径变量指定默认值
首先,.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
属性
Delay Validation
属性设置为True
<强>参考强>
答案 2 :(得分:1)
我找到了解决自己问题的方法:为FileName
变量分配默认值。我分配了ABC
并且它有效。按预期生成两个文件,一个用于ABC,一个用于DEF。