9

这让我觉得非常奇怪的行为,我花了一段时间检查我的代码中的错误,然后才发现这个

"out 从数据库表或视图复制到文件。如果指定现有文件,则文件将被覆盖。提取数据时,请注意 bcp 实用程序将空字符串表示为空字符串,将空字符串表示为空字符串。 " (来自http://msdn.microsoft.com/en-us/library/ms162802.aspx

显然,这让我能够解决我的问题,但有人能想到或有人知道为什么会这样吗?

4

3 回答 3

9

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

SQL Server 6.5 不能存储空字符串:总是有一个空格。这在 SQL 7 中发生了变化

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

于 2009-11-01T17:41:59.663 回答
1
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 输出为空!感谢你的协助。埃里克

于 2017-02-24T18:59:45.870 回答
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。

于 2017-09-27T06:52:06.817 回答