为什么bcp在列包含空字符串时输出null而在列为空时输出空字符串?

时间:2009-10-29 15:56:55

标签: sql sql-server null bcp

这让我感到非常奇怪,我在发现这个错误之前花了一些时间检查代码中的错误

“将数据库表或视图中的副本输出到文件。如果指定现有文件,则覆盖该文件。提取数据时,请注意bcp实用程序将空字符串表示为null,将空字符串表示为空字符串。“ (来自http://msdn.microsoft.com/en-us/library/ms162802.aspx

显然,这让我可以解决我的问题,但任何人都可以想到或者是否有人知道为什么会出现这种情况?

3 个答案:

答案 0 :(得分:9)

已经有一段时间了,但我确信这是SQL Server 6.5的向后兼容性/遗产

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

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

答案 1 :(得分:1)

这与"默认值"相关。 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

  

以下限定符指定数据文件中的空字段在批量导入操作期间保留其空值,而不是继承表列的默认值(如果有)。

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

答案 2 :(得分: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查询中使用了Case结构   将空字符串更改为null。 BCP反过来输出结果   null为空!   谢谢你的协助。   埃里克