Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 区分CSV文件中的零长度varchar和NULL值_Sql Server 2008_Ssis - Fatal编程技术网

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

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

考虑以下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
文件的属性: 列标题=真 列分隔符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,也可以将它们保留为零长度字符串