1

考虑以下 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

文件属性:

  1. 列标题 = True
  2. 列分隔符 char = 逗号
  3. 文本分隔符 char = "
  4. 行分隔符 = {CR}{LF}
  5. 由两次连续出现的文本分隔符 char 表示的数据中的文本分隔符

列定义:

  1. Col1 = varchar
  2. Col2 = varchar
  3. Col3 = 数字

正如我在使用 DTS 时所记得的那样,DTS 包在处理数据中可能包含列定界符、文本定界符或行定界符的文件时没有问题。此外,它还可以区分 NULL 和非 null 值,特别是 NULL 字符串与零长度字符串。

经过我认为充分的测试后,我在此 Stack Overflow 帖子中评论说,我认为 SSIS 的 CSV 解析器根本无法处理数据中的特殊字符,例如数据中的文本分隔符或行分隔符字符。请参阅使用 Excel 创建带有特殊字符的 CSV 文件,然后使用 SSIS 将其导入数据库。我仍然不敢相信并再次提及它以希望我弄错了,因为对我来说 SSIS 无法处理这种情况似乎深不可测,唯一的解决方法是选择数据中不出现的文本分隔符.

但是,让我谈谈关于 NULL 值的主要问题。最近,我发现除非我在文件输入对象上设置“保留空值”属性

在此处输入图像描述 以及目标表对象上的“保持空值”属性,

在此处输入图像描述

在数字目标列的情况下,未检测到 NULL 值并且 null 值变为零长度 varchar 值或 0。在上面的示例中,我认为以下行列具有空值:

  1. 第 2 行第 3 列
  2. 第 3 行,第 2 列

由于我的目标数据库是区分零长度 varchar 和空 varchar 的 SQL Server,因此我不认为第 2 行第 2 列中的值为空,而是零长度 varchar。但是,当数据从示例文件传输到允许所有这些列为空的目标表时,零长度字符串将作为 NULL 加载!

由于“保留空值”和“保留空值”设置似乎是在文件和表对象级别而不是在列级别,似乎没有办法只为我的列“打开”“保留空值”期望有空值。例如,假设我有一个包含 42 个 varchar 列的文件,其中 41 个,我满足于使用空字符串而不是空值,但是对于单个列,我想保留和区分 NULL 值和一个空字符串值,有没有办法做到这一点?空 varchar 列和零长度 varchar 列值似乎都加载为 NULLS。

处理此问题的最佳方法是什么,使用派生列转换或脚本任务来修改值?有人可以帮助我使用 C# 脚本或提供任何一种方法的详细信息或提出更好的方法吗?

我在 SO 上看到一些帖子说没有办法区分 CSV 文件中的 NULL 和零长度 varchar 值,但我相信上面的例子是你如何做到的,这只是你如何做的问题让 SSIS CSV 解析器正确解析它,或者解析器是否符合要求。

4

1 回答 1

0

我知道这并不能完全回答你的问题,但这就是我发现的。

我还没有测试过 OLEDB Destination 上的 Keep Nulls 属性,因为我认为它的含义略有不同。我正在通过查看 SSIS 中的数据查看器来验证我的所有测试,将 OLEDB 目标作为一个因素从图片中删除。

  1. 导入非文本限定文件时,未勾选保留 Null 值,空列(即两个分隔符之间没有任何内容)和仅包含空格的列按原样导入:作为零长度字符串,以及一系列的空间分别。
  2. 如果勾选 Retain Null Values,零长度列将转换为 NULL,但包含空格的列将保持原样。
  3. 使用文本限定文件,它变得更加复杂。如果未勾选保留空值,则无法从文件中获取空值。无论它是一个适当限定的空字符串(例如“”,“NextColumnValue”),还是什么都没有(例如,“NextColumnValue”),SSIS 将它变成一个零长度字符串。
  4. 使用文本限定文件并勾选保留 Null 值,以下是结果,正确限定的空字符串 ("") 和列分隔符之间完全没有任何内容都变为 NULL。

这些结果与您的发现一致。并且肯定似乎没有可以调整的逐列设置:使用 Retain Nulls 复选框,您可以将所有零长度字符串(以及缺少文本限定符,如果适用)变为 NULL,或者您可以将它们保留为零长度字符串。

于 2016-03-08T11:47:09.193 回答