1

很抱歉让我的麻烦让你的一天变得黑暗,但是 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 数据?即,当某些列清楚且完全是数字、货币或日期时,为什么我需要将每个输入列设置为字符串?(是的,源 CSV 文件非常干净——大多数甚至没有 NULLS)

一个。当我将与日期相关的源列的高级映射更改为日期时,我收到永远存在的错误消息:[平面文件源 [30]] 错误:数据转换失败。“结算日期”列的数据转换返回状态值 2 和状态文本“由于可能丢失数据,无法转换该值。”。

2)当我在包 B 中将数据类型重置回字符串时,我仍然会收到错误——通常是截断错误(是的——我已将其中一列的长度调整为 250)。一个。错误消息:“由于潜在的数据丢失,无法转换该值。”。湾。当我重置映射以忽略该列(作为测试)时,它会在下一列引发类似的错误。

3)任何想法为什么包A会复制文件的数据而不处理第二个文件,但没有抛出错误并将两者都移动到存档?

4) 为什么数据查看器似乎有解析错误(它在错误的列中显示数据)但是当您使用数据查看器中的复制数据功能并将其粘贴到 Excel 中时,所有数据都完美排列?

5) 是否有任何 SSIS 新手用户需要了解的提示和技巧,这些提示和技巧在文档和搜索网络文章以及本网站中可能不明显?

如果他们有帮助的话,我可以提供更多的细节,但是这些包真的非常简单,不应该让我这么沮丧。

感谢您的任何见解。

DGP

4

2 回答 2

0

哇,您似乎有很多 ssis 问题...我认为提取同一文件的原因是因为您的“变量映射”的定义方式。

您是否看过并遵循本指南:

https://www.simple-talk.com/sql/ssis/ssis-basics-introducing-the-foreach-loop-container/

希望这可以帮助。

沙欣

于 2016-10-26T15:57:05.593 回答
0

感谢 Tab 和 Shaheen,

致所有 SSIS 新手——请从我的错误中吸取教训!

看来我的问题实际上在于我如何在连接管理器中识别 TEXT QUALIFIER。我输入了“”,这导致我的列的解析方式出现问题。解析问题导致某些列中出现意外值,这导致了包中的错误。

当我尝试将文本限定符更改为只有一个双引号 - “ - 整个事情都奏效了!

正如我所提到的 - 正如 Shaheen 所怀疑的那样 - 我最初的重复处理问题可能是由于我如何设置 foreach 循环。我已经解决了这个问题,在我修复文本限定符之前,bit 仍然会出错。

我只测试了几次,但看起来这就是问题所在。

感谢您的贡献。

DGP

于 2016-10-27T22:42:46.683 回答