考虑以下 6 行示例 CSV 文件
"Col1","Col2", "Col3",
"Col1Row1","Col2Row1", 1
"Col1Row2","",
"Col1Row3",,0
"Row 4 Example of ""double quotes"" in the data","Row 4 col 2",0
"Row 5 Example of a comma, no problem, in the data","Row 5 col 2",0
"Row 6 Example of embedded CR LF right here
in the data","Row 6 col 2",0
文件属性:
- 列标题 = True
- 列分隔符 char = 逗号
- 文本分隔符 char = "
- 行分隔符 = {CR}{LF}
- 由两次连续出现的文本分隔符 char 表示的数据中的文本分隔符
列定义:
- Col1 = varchar
- Col2 = varchar
- Col3 = 数字
正如我在使用 DTS 时所记得的那样,DTS 包在处理数据中可能包含列定界符、文本定界符或行定界符的文件时没有问题。此外,它还可以区分 NULL 和非 null 值,特别是 NULL 字符串与零长度字符串。
经过我认为充分的测试后,我在此 Stack Overflow 帖子中评论说,我认为 SSIS 的 CSV 解析器根本无法处理数据中的特殊字符,例如数据中的文本分隔符或行分隔符字符。请参阅使用 Excel 创建带有特殊字符的 CSV 文件,然后使用 SSIS 将其导入数据库。我仍然不敢相信并再次提及它以希望我弄错了,因为对我来说 SSIS 无法处理这种情况似乎深不可测,唯一的解决方法是选择数据中不出现的文本分隔符.
但是,让我谈谈关于 NULL 值的主要问题。最近,我发现除非我在文件输入对象上设置“保留空值”属性
以及目标表对象上的“保持空值”属性,
在数字目标列的情况下,未检测到 NULL 值并且 null 值变为零长度 varchar 值或 0。在上面的示例中,我认为以下行列具有空值:
- 第 2 行第 3 列
- 第 3 行,第 2 列
由于我的目标数据库是区分零长度 varchar 和空 varchar 的 SQL Server,因此我不认为第 2 行第 2 列中的值为空,而是零长度 varchar。但是,当数据从示例文件传输到允许所有这些列为空的目标表时,零长度字符串将作为 NULL 加载!
由于“保留空值”和“保留空值”设置似乎是在文件和表对象级别而不是在列级别,似乎没有办法只为我的列“打开”“保留空值”期望有空值。例如,假设我有一个包含 42 个 varchar 列的文件,其中 41 个,我满足于使用空字符串而不是空值,但是对于单个列,我想保留和区分 NULL 值和一个空字符串值,有没有办法做到这一点?空 varchar 列和零长度 varchar 列值似乎都加载为 NULLS。
处理此问题的最佳方法是什么,使用派生列转换或脚本任务来修改值?有人可以帮助我使用 C# 脚本或提供任何一种方法的详细信息或提出更好的方法吗?
我在 SO 上看到一些帖子说没有办法区分 CSV 文件中的 NULL 和零长度 varchar 值,但我相信上面的例子是你如何做到的,这只是你如何做的问题让 SSIS CSV 解析器正确解析它,或者解析器是否符合要求。