区分CSV文件中的零长度varchar和NULL值

时间:2013-01-16 14:41:14

标签: sql-server-2008 ssis

考虑以下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
  6. 表示的数据

    列定义:

    1. Col1 = varchar
    2. Col2 = varchar
    3. Col3 =数字
    4. 我记得在我使用DTS的日子里,DTS包在处理可能包含数据中的列分隔符,文本分隔符或行分隔符字符的文件时没有问题。此外,它还可以区分NULL和非空值,特别是NULL字符串与零长度字符串。

      在我认为足够的测试之后,我在Stack Overflow帖子中发表了评论,我认为SSIS的CSV解析器根本无法处理数据中的特殊字符,例如数据中的文本分隔符或行分隔符字符。见Using Excel to create a CSV file with special characters and then Importing it into a db using SSIS。我仍然无法相信并再次提起它,因为我错了,因为我觉得SSIS无法处理这种情况并且唯一的解决办法就是选择一个不会发生的文本分隔符。数据。

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

      enter image description here 和#34;保持空值"目标表对象上的属性

      enter image description here

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

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

        因为"保留NULLs"和#34;保持空虚"设置似乎是在文件和表对象级别而不是在列级别,似乎没有办法打开"打开" "保留空虚"对于我期望有空的列。例如,让我们说我有一个包含42个varchar列的文件,其中41个是其中一个,我满足于使用空字符串而不是空字符串,但对于单个列我想保留和区分在NULL值和空字符串值之间,有没有办法做到这一点? null varchar列和零长度varchar列值似乎都作为NULLS加载。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

  1. 导入非文本限定文件时,如果未选中“保留空值”,则两个空列(即它们之间没有任何内容的两个分隔符)和仅包含空格的列将按原样导入:作为零长度字符串,和一系列空格。
  2. 如果勾选Retain Null Values,则零长度列将转换为NULL,但包含空格的列将保持原样。
  3. 使用文本限定文件,它会变得更复杂。如果保留Null Null值,则无法从文件中获取NULL。无论它是一个合格的空字符串(例如“”,“NextColumnValue”),还是什么都没有(即“NextColumnValue”),SSIS将其转换为零长度字符串。
  4. 使用文本限定文件,并勾选保留空值,这是结果,正确限定的空字符串(“”)和列分隔符之间完全没有任何内容都将变为NULL。
  5. 这些结果与您的发现一致。并且肯定似乎没有可以调整的逐列设置:使用Retain Nulls复选框,您可以将所有零长度字符串(以及缺少文本限定符,如果适用)转换为NULL,或者你可以将它们保留为零长度字符串。