【发布时间】:2016-10-26 15:34:19
【问题描述】:
很抱歉我的麻烦让你的一天变得灰暗,但是 SSIS 让我失望了!我是 SSIS 的新手,但我似乎误解了它。
对于背景:我有几个版本的基本包,其中包括一个 Foreach 循环容器和一个带有一些派生列的数据流,这些派生列将 CSV 文件导入 SQL Server 暂存表。它非常简单,确实包括一个执行 SQL 任务和一个文件移动,但它们工作正常。问题在于 Foreach 循环和数据流。
我有这个包的一个版本(我们称之为“A”),它似乎运行良好。它将处理文件夹中的多个文件,将记录插入临时表,正确执行 SQL 语句,并将文件移动到存档。在我仔细地对过程进行 QA 之前,一切似乎都很好。原来它是从一个文件中复制数据,而不是从第二个源文件中导入数据!然而,第二轮/重复数据包括第二个文件的源文件名(通过派生列)(但来自第一个文件的数据)。所以看起来我已经成功处理了这两个文件,直到我查看了实际数据并发现第二个源文件中的任何值都没有写入暂存表。
一旦我发现这一点,我就认为问题出在 Foreach 循环以及我如何设置不同的文件路径和名称变量。所以,我决定尝试制作一个新版本的包。我首先复制包 A 并创建包 B。在 B 中,我删除了源连接管理器并创建了一个新的连接管理器以及所有新的文件和路径变量。然后我尝试清理/修复/替换我的数据流和 Foreach 循环中的各种元素。在这个过程中,我发现来自 A 的高级映射(DID 工作)几乎都设置为字符串(甚至货币和日期列)。这似乎不对,因此我通过更改为数据类型货币来修改每个来源货币列,并将每个与日期相关的列更改为数据类型日期。
随之而来的是几十个错误,我无法让包 B 运行。我什至将所有 B 数据类型都改回了字符串(反映了 DID 工作的包 A 中的设置)。但是,仍然没有快乐。
这让我想问一些比我聪明的人:
1) 为什么 SSIS 不能使用正确的数据类型解释源 CSV 数据? IE。当某些列清楚且完全是数字、货币或日期时,为什么我需要将每个输入列设置为字符串? (是的,源 CSV 文件非常干净——大多数甚至没有 NULL)
一个。当我将与日期相关的源列的高级映射更改为日期时,我收到永远存在的错误消息:[平面文件源 [30]] 错误:数据转换失败。 “结算日期”列的数据转换返回状态值 2 和状态文本“由于可能丢失数据,无法转换该值。”。
2) 当我在包 B 中将数据类型重置回字符串时,我仍然会收到错误——通常是截断错误(是的——我已将其中一列的长度调整为 250)。 一种。错误消息:“由于潜在的数据丢失,无法转换该值。”。 湾。当我重置映射以忽略该列(作为测试)时,它会在下一列引发类似的错误。
3) 任何想法为什么包 A 会复制文件的数据而不处理第二个文件,但没有抛出错误并将两者都移动到存档?
4) 为什么数据查看器似乎有解析错误(它在错误的列中显示数据),但是当您使用数据查看器中的复制数据功能并将其粘贴到 Excel 中时,所有数据都完美排列?
5) 是否有任何 SSIS 新手用户需要了解的提示和技巧,而这些提示和技巧在文档和搜索网络文章以及本网站中可能不明显?
如果他们有帮助,我可以提供更多详细信息,但这些包真的非常简单,不应该让我这么沮丧。
感谢您提供任何见解。
DGP
【问题讨论】:
-
文件夹中的所有文件是否具有完全相同的列、完全相同的数据类型、完全相同的顺序?
标签: ssis foreach-loop-container