【发布时间】:2018-10-12 00:48:02
【问题描述】:
按照 MSSQLTips 博客文章中的说明,我设置了带有 Foreach 循环的程序包,以遍历工作簿中的所有工作表并将数据导入表中。
循环正在查找正确的工作表 ('11-18$'),然后是名称较长的同一工作表 ('11-18$'_xlnm#_FilterDatabase)。额外的工作表导致data duplication 和错误消息,例如"Derived Column.Outputs[Derived Column Output].Columns[SourceSheet]" specifies failure on truncation。
如何使循环排除“xlnm#_FilterDatabase”对象?
为什么循环会复制工作表数据?
MSSQLTips 博文--Read Data From Multiple Excel Worksheets SSIS
Foreach 循环设置:
变量
- 变量是
Name:'Sheet Name',Scope:'Import_AXExtractAgristatsInventory'(包名),Date type:'String',Value:'11-18$'Foreach 循环编辑器
集合枚举器是
Foreach ADO.NET Schema Rowset Enumerator连接提供者是
.Net Providers for OleDb\Microsoft Office 12.0 Access Database Engine OLE DB Provider连接文件是
\\filepath\file.XLSX的路径连接高级扩展属性是
Excel 12.0连接变量映射是
Variable:='User:SheetName',Index:='2'连接字符串是
Data Source=C:\filepath\file.xlsx;Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;
更新:Foreach ADO.NET Schema Rowset Enumerator 和 Set Restrictions 限制
我认为Set Restrictions 选项可以使用诸如!=*_FilterDatabase* 之类的表达式来解决问题(排除幻像表),但根据flylib 在线的电子书摘录,通配符不是一个选项......
ADO.NET Schema Rowset Enumerator 提供了一种方法来枚举 数据源的架构。例如,您可以枚举表 数据库、服务器上的目录或表的列。对于每个 架构,您可以通过多种方式过滤结果。图 13.13 显示 Foreach ADO.NET Schema Rowset Enumerator Editor 和 已选择目录架构。
无法为限制指定通配符。
参考:Microsoft SQL Server 2005 Integration Services: Stock Foreach Enumerators
- 图 13.13。 Foreach ADO.NET Schema Rowset Enumerator 提供了一种枚举数据库模式的方法。
- 图 13.14 显示了 Tables Schema Restrictions 对话框 表架构。
更新:循环调试值
为了调试循环中的工作表对象,我终于找到了一种方法来停止循环并显示工作表名称。我在 Pragmatic Works 博客文章中找到了一篇文章,其中展示了如何使用 Script Task、Break Point 和 Watch Window 来显示该活动循环值——Looping through resultset with foreach loop。
这些是建议的 SO 问题...
【问题讨论】:
-
我在 Blog by Todd Chitt 上找到了解决此问题的 SSIS 解决方案,但他的解决方案意味着我必须将我的包从
Foreach Loop > DataFlow重新处理为更复杂的过程DataFlow > [Script Task] and [RecordSet destination] > Foreach Loop。不确定这是否是我正在寻找的变化。 -
SQLServerCenter Forums 上提出了同样的问题,但我没有看到答案。
-
我做了更多的测试,发现了最奇怪的事情......当我在桌面上打开源 excel 文件然后运行包时,“FilterDatatbase”幻像表不再位于循环。 (·_·ヾ ?这只是一个有趣的注释。仍在研究最佳解决方案。
标签: sql-server excel for-loop ssis