【发布时间】:2018-09-16 07:46:09
【问题描述】:
我正在 Visual Studio 2015(带有数据工具扩展)上开发一个简单的 SSIS 包:它有一个连接(Sql server 2008),一个 OLEDB 源,包含一个查询,连接到一个平面文件目标。
- 数据库连接已经过测试并且可以正常工作;
- oleDb 来源有效,查询中没有变量;
- OleDb 源内部的查询返回大约 700 条记录
- OleDb 中的预览返回 200 条记录(按照配置)
- 查询和文件之间的映射是 1:1,查询中的所有字段都以相同的顺序包含在生成的 csv 中。
当我运行包时,会创建 csv 文件,它包含完全需要的字段,但只有 169 条记录(预计大约 700 条)。
我将 csv 的内容与查询中的数据进行了比较,发现:
- 记录的顺序不同
- 未导出的记录看似随机放置在 sql 结果中(我以为导出的是第一个但事实并非如此)
- 缺失记录中的数据没有什么奇怪的(没有长字符串或空值,或超出范围的值)
- 重复执行多次提取和丢失的记录完全相同,顺序相同。
您有什么建议可以解决这个问题吗?我需要以相同的顺序导出所有记录。查询中的 Order by 子句似乎被导出忽略了,导出的记录是原始记录的样本。
【问题讨论】:
-
这似乎很奇怪,除非您使用的是 .csv 文件的副本,该文件在电子表格中具有以前的格式。创建一个新的 .csv(不是副本)。获取查询的结果集并手动插入 .csv。删除行。然后在您的 SSIS 包中映射数据。看看是否有效
-
记录的顺序不同。你这是什么意思?数据在 SQL Server 中没有按任何特定顺序存储,那么您在说什么“顺序”?确保查询中数据顺序的唯一方法是使用
ORDER BY,而在 SSIS 中唯一的方法是使用排序转换。 SSIS 不会只是不导出某些行,这是有原因的。那是什么原因可能有很多;例如转换错误、过滤结果集、过滤数据流等 -
确保行在任何时候都不会被忽略失败记录的静默错误处理丢弃。源中的
ORDER BY子句将确保按顺序处理行。执行后查看 DTS 的输出窗口以检查异常情况。 -
请仔细检查您的 OLEDB 源查询,您的输出查询中可能缺少一个简单的逻辑
-
您可能需要确保查看的是正确的 csv。有多少条记录进入输出对象?
标签: sql-server csv ssis export-to-csv