抱歉让我的烦恼变暗,但是SSIS打破了我!我是SSIS的新手,我似乎只是误解了它。
对于后台:我有几个版本的基本软件包,其中包含一个Foreach循环容器和一个带有一些派生列的数据流,可将CSV文件导入SQL Server登台表。它非常简单,包括执行SQL任务和文件移动,但这些工作正常。问题在于Foreach循环和数据流。
我有一个版本的这个软件包(让我们称之为“A”)似乎工作正常。它将处理文件夹中的多个文件,将记录插入到临时表中,正确执行SQL语句,并将文件移动到存档。在我仔细检查过程之前,一切似乎都很好。原来它是从一个文件复制数据,从不从第二个源文件导入数据!然而,第二轮/数据轮数据包括第二个文件的源文件名(通过派生列)(但是来自第一个文件的数据)。所以看起来我成功处理了BOTH文件,直到我查看实际数据并发现第二个源文件中没有任何值被写入Staging表。
一旦我发现了这个,我发现问题出现在Foreach循环中以及我如何设置不同的文件路径&名称变量。所以,我决定尝试制作一个新版本的软件包。我开始复制包A并创建包B.在B中,我删除了源连接管理器并创建了一个新的连接管理器以及所有新文件&路径变量。然后我尝试清理/修复/替换我的Data Flow和Foreach循环中的各种元素。在这个过程中,我发现来自A的高级映射 - DID工作 - 实际上都设置为String(甚至是Currency和Date列)。这似乎不对,所以我通过更改为数据类型Currency来修改每个源钱列,并将每个与日期相关的列更改为数据类型Date。
接下来是几十个和几十个错误,我无法运行B包。我甚至将所有B数据类型都更改回String(镜像DID中的DID工作中的设置)。但是,仍然没有快乐。
这让我向你们提出一些比我更聪明的问题:
1)为什么SSIS不能使用正确的数据类型解释源CSV数据?即为什么我需要将每个输入列设置为STRING,当某些列明显&完全数字,货币或日期? (是的,源CSV文件非常干净 - 大多数甚至没有NULLS)
一个。当我将日期相关的源列的高级映射更改为日期时,我收到始终存在的错误消息:[平面文件源[30]]错误:数据转换失败。列"结算日期"的数据转换返回状态值2和状态文本"由于可能丢失数据,无法转换该值。"。
2)当我将数据类型重置回包B中的String时,我仍然会收到错误 - 通常是截断错误(和是 - 我已经在其中一列中将长度调整为250)。 一个。错误消息:"由于可能丢失数据,无法转换该值。"。 湾当我重置Mappings以忽略该列(作为测试)时,它会在下一列引发类似的错误。
3)任何想法为什么包A会欺骗文件的数据而不处理第二个文件,但没有抛出任何错误并将它们都移到存档?
4)为什么数据查看器似乎有解析错误(它显示错误列中的数据)但是当您在数据查看器中使用复制数据功能并将其粘贴到Excel中时,所有数据都完美排列?
5)是否有任何提示&新手SSIS用户需要了解的技巧,以及通过文档和搜索网络文章以及本网站可能不明显的技巧?
我可以提供进一步的细节,如果他们会有所帮助,但这些套餐真的非常简单,不应该让我这么沮丧。
感谢任何见解。
DGP
答案 0 :(得分:0)
您有没看过并遵循本指南:
https://www.simple-talk.com/sql/ssis/ssis-basics-introducing-the-foreach-loop-container/
希望这有帮助。
沙欣
答案 1 :(得分:0)
谢谢标签&沙欣,
对所有SSIS新手 - 请从我的错误中吸取教训!
看来我的问题实际上是我如何识别Connection Manager中的TEXT QUALIFIER。我已进入""这导致了我的列被解析的问题。解析问题导致意外值出现在某些列中,并导致包中的错误。
当我尝试将文本限定符更改为仅一个双引号时 - " - 整个过程都奏效了!
正如我所提到的 - 正如Shaheen所怀疑的那样 - 我对重复处理的初始问题可能是由于我如何设置foreach循环。我已经解决了这个问题,在修复文本限定符之前,位仍然出错。
我只测了几次,但看起来就是这个问题。
感谢您的贡献。
DGP