Sql server 2008 区分CSV文件中的零长度varchar和NULL值
考虑以下6行示例CSV文件Sql server 2008 区分CSV文件中的零长度varchar和NULL值,sql-server-2008,ssis,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 embedd
"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
文件的属性:
列标题=真
列分隔符char=逗号
文本分隔符字符=
行分隔符={CR}{LF}
由两个连续出现的文本分隔符字符表示的数据中的文本分隔符
列定义:
Col1=varchar
Col2=varchar
Col3=数字
回想我使用DTS的日子,DTS包在处理数据中可能包含列分隔符、文本分隔符或行分隔符的文件时没有问题。此外,它还可以区分空值和非空值,特别是空字符串与零长度字符串
在我考虑足够的测试之后,我在这个堆栈溢出日志中评论了,我认为SSIS的CSV解析器根本无法处理数据中的特殊字符,例如数据中的文本分隔符或行分隔符字符。看见我仍然不敢相信,并再次提到它,希望我弄错了,因为SSIS无法处理这种情况,而且唯一的解决办法是选择一个在数据中不出现的文本分隔符
但是,让我来回答关于空值的主要问题。最近,我发现除非在文件输入对象上设置retainnull Values属性,否则 以及目标表对象的Keep Null values属性 未检测到空值,空值变为零长度varchar值或0(对于数字目标列)。在上面的示例中,我认为以下行列具有空值: 第2行第3列 第3行第2列由于我的目的地数据库是SQL Server,它区分零长度VARCHAR和空VARCHAR,所以我不认为行2列2中的值是空的,而是零长度VARCHAR。但是,当数据从示例文件传输到允许所有这些列为空的目标表时,零长度字符串将作为空值加载
由于Retain NULLs和Keep NULLs设置似乎位于文件和表对象级别,而不是列级别,因此似乎无法仅为我希望具有null的列启用Retain NULLs。例如,假设我有一个包含42个varchar列的文件,对于其中的41个,我满足于使用空字符串而不是空字符串,但是对于单个列,我希望保留并区分空值和空字符串值,有什么方法可以做到这一点吗?null varchar列和零长度varchar列值似乎都作为null加载 处理此问题的最佳方法是使用派生列转换或脚本任务修改值?有人能帮我写C脚本吗,或者提供这两种方法的细节,或者建议一种更好的方法我在SO上看到一些帖子说,无法区分CSV文件中的NULL和零长度varchar值,但我相信上面的例子是如何做到的,这只是一个如何让SSIS CSV解析器正确解析它的问题,或者解析器是否达到了标准。我知道这并不能完全回答您的问题,但我发现了以下几点 我还没有在OLEDB目的地上测试Keep Nulls属性,因为我认为这有一个稍微不同的含义。我通过查看SSI中的数据查看器来验证我的所有测试,将OLEDB目标作为一个因素从图片中删除 导入非文本限定文件时,如果未勾选Retain Null值,则空列(即两个分隔符之间没有任何分隔符)和仅包含空格的列将按原样导入:分别作为零长度字符串和一系列空格导入。 如果勾选“保留Null值”,长度为零的列将转换为Null,但包含空格的列将保持原样。 对于文本限定文件,它会变得更复杂。如果不勾选retainnull值,则无法从文件中获取Null。无论它是一个正确限定的空字符串(例如NextColumnValue),还是完全没有(例如NextColumnValue),SSIS都会将其转换为零长度字符串。 使用文本限定文件并勾选Retain Null Values,结果如下:正确限定的空字符串和列分隔符之间完全缺少任何内容都将变为Null。 这些结果与你的发现是一致的。而且似乎没有可以调整的逐列设置:使用Retain Nulls复选框,您可以将所有零长度字符串和缺少文本限定符(如果适用)转换为NULL,也可以将它们保留为零长度字符串