【问题标题】:Why does bcp output null when the column contains an empty string and empty string when the column is null?为什么bcp列包含空字符串时输出null,列为null时输出空字符串?
【发布时间】:2010-12-11 07:28:56
【问题描述】:

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

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

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

【问题讨论】:

标签: sql sql-server null bcp


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:
    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 结构来 将空字符串更改为空。 BCP 依次输出结果 null 为空! 谢谢你的协助。 埃里克

    【讨论】:

      【解决方案3】:

      这与 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-20
        • 2022-01-04
        • 1970-01-01
        • 2021-08-15
        • 2017-01-13
        • 1970-01-01
        相关资源
        最近更新 更多