为什么bcp在列包含空字符串时输出null而在列为空时输出空字符串?
-
10-07-2019 - |
题
这让我感到非常奇怪,我在发现这个错误之前花了一些时间检查代码中的错误
<!>“;将数据库表或视图中的副本输出到文件。如果指定现有文件,则会覆盖该文件。提取数据时,请注意bcp实用程序将空字符串表示为null,将空字符串表示为空字符串。<!> quot; (来自 http://msdn.microsoft.com/en-us/library/ms162802的.aspx )
显然,这让我可以解决我的问题,但任何人都可以想到或有没有人知道为什么会这样?
解决方案
已经有一段时间了,但我确信这是SQL Server 6.5的向后兼容性/遗产
SQL Server 6.5无法存储空字符串:总有一个空格。这改变了SQL 7
从历史的角度来看,'' -> NULL
和' ' -> ''
是正确的。
其他提示
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 /主题/ SQL服务器/答复/ 143738-BCP-插入空白空间空字符串
我找到了一个解决方法,在sql查询中使用了Case结构 将空字符串更改为null。 BCP反过来输出结果 null为空! 谢谢你的协助。 埃里克
这与<!>“默认值<!>”相关; BCP部分:
例如,如果数据文件中有空字段,则会加载列的默认值。
您必须回想起从其他奇怪系统导入纯文本文件的日子。 BCP将''
转换为<!>“未定义<!>”;(=缺少数据)并在数据库中设置NULL(=缺少数据)。从数据库中绕过NULL的另一种方式必须是-k
用于其他系统。
要从数据库中获取“真实”数据,请使用<=>开关:
以下限定符指定数据文件中的空字段在批量导入操作期间保留其空值,而不是继承表列的默认值(如果有)。
然后你的文件/数据库中有你的ASCII 0x0。