2009-10-29 376 views
7

这让我感到非常奇怪的行为,我花了一段时间检查我的代码中的错误之前,我发现这当列为空时,为什么bcp输出为null,而列为空时为空?

“从数据库表或视图复制到一个文件如果指定一个现有的文件,文件在提取数据时,请注意bcp实用程序将空字符串表示为空字符串,并将空字符串表示为空字符串。 (从http://msdn.microsoft.com/en-us/library/ms162802.aspx

很明显,这使我能够解决我的问题,但任何人都可以想到或有人知道为什么会出现这种情况?

+0

http:// stackoverflow。com/questions/12588149/how-to-make-microsoft-bcp-export-empty-string-instead-of-a-nul-char提供了一个潜在的解决方案 – Dan 2013-09-12 13:00:25

回答

8

它已经一段时间了,但我敢肯定,这是一个向后兼容/遗留回来到SQL Server 6.5

SQL Server 6.5中无法存储空字符串:总有一个空间。这改变了SQL 7

所以'' -> NULL' ' -> ''是从古代历史的角度来看是正确的。

0
SELECT ARTICULO as Articulo, 
     case when rtrim(CCOLOR) = '' then null else rtrim(CCOLOR) end as Color, 
     case when rtrim(TALLE) = '' then null else rtrim(TALLE) end as Talle, 
from precios 

发送null代替空。

我在这里找到了最好的解决方案:

https://bytes.com/topic/sql-server/answers/143738-bcp-inserting-blank-space-empty-string

我发现周围的工作,使用SQL查询的个案结构 变空字符串为空。 BCP依次输出结果为空的 null! 感谢您的协助。 埃里克

0

这是关系到“默认值”部分,BCP:

https://docs.microsoft.com/en-us/sql/relational-databases/import-export/keep-nulls-or-use-default-values-during-bulk-import-sql-server

例如,如果在数据文件中的空场,为默认值该列被加载。

你必须回想从其他怪异系统导入纯文本文件的日子。 BCP将''转换为“未定义”(=缺失数据)并在数据库中设置NULL(=缺失数据)。对于其他系统来说,来自数据库的NULL的另一种方法必须是''

要得到“真实”的数据从数据库中使用-k开关:

https://docs.microsoft.com/en-us/sql/relational-databases/import-export/keep-nulls-or-use-default-values-during-bulk-import-sql-server#keep_nulls

下预选赛指定大部分过程中数据文件的空场保留其空值-import操作,而不是继承表列的默认值(如果有)。

然后你的文件/数据库中有你的ASCII码0x0。

相关问题