【问题标题】:bcp queryout xml format file encoding utf-8 xml file validation failbcp queryout xml 格式文件编码 utf-8 xml 文件验证失败
【发布时间】:2018-09-12 10:10:17
【问题描述】:

我必须为 encoding="UTF-8 格式生成 xml 文件。我使用 bcp queryout。正在生成 xml 文件。但我的问题是 xml 文件验证失败。谁能帮我解决这个问题?这个是我的代码。

 DECLARE @xmlBody AS VARCHAR(MAX)= '<?xml version="1.0" encoding="UTF-8"?>'+ CAST(@xmlStr  AS VARCHAR(MAX)) 


       INSERT INTO  [dbo].[MasterXml]   
           ([PurchaseOrderID] ,[Code])          
        values (@PurchaseOrderID, @xmlBody)                         
        Declare @command varchar(8000)          

        SET @command= 'bcp "SELECT TOP 1 [Code] from  [tec_Dev].[dbo].[MasterXml] where PurchaseOrderID='+          
        CAST( @PurchaseOrderID As varchar(20))+'" queryout '            
         +@uploadFolder + CAST(@PurchaseOrderID AS varchar(20))+'.xml' +' -T -N -w -c -C65001'

    print @command

EXEC xp_cmdshell @command 

【问题讨论】:

  • 也许@xmlStr 有点错误?

标签: sql xml utf-8 encode bcp


【解决方案1】:

查看您的代码,我知道这是[sql-server]...

SQL-Server 的 VARCHAR-type 是 1 字节编码的扩展 ASCII(取决于关联的 COLLATION)而不是 UTF-8...

每当 SQL-Server 谈论 unicode 时,它都是原生的 NVARCHARNCHAR 类型,这是一个 2 字节编码的字符串 (@987654331 @ 实际上)。

此外,您正在说明一些开关

  • -N:无论如何都要使用原生类型,字符使用 unicode
  • -w: 显式切换使用 unicode
  • -C:第 65001 页 (utf-8),而文档明确告诉您,this codepage is not supported!

如果其他都还好,您的代码应该在磁盘上放置一个 2-byte-unicode 的文件,但会大喊:“我是 UTF-8!”。在 XML 的声明中尝试对 UTF-16 进行相同的操作。或者,您可以使用任何其他工具将 SQL-Server 的输出转换为您选择的编码。

我倾向于 C#:从 SQL-Server(根本没有 BCP)将 XML 直接读入 .NET 字符串(总是 unicode!),并使用正确的编码将 .Net 字符串写入文件。

更新

在给定的链接 (BCP documentation for SQL Server 2014) 仍然有

** 重要 ** SQL Server 不支持代码页 65001(UTF-8 编码)。

但对于 2016+ 版本,您可以找到:

版本 13 (SQL Server 2016 (13.x)) 之前的版本不支持 代码页 65001(UTF-8 编码)。 13开头的版本可以 将 UTF-8 编码导入早期版本的 SQL Server。

但 2014-SP2 实际上将此添加到 v2014 (KB-Article 3136780)。所以文档没有涵盖这种向后增强。

它应该可以使用这种组合导出 UTF-8,而无需 -N -w:

-c -C65001

【讨论】:

  • 感谢您的回答。但我找到了 Microsoft SQL Server 2014 (SP2-CU6) (KB4019094) - 12.0.5553.0 (X64) 的解决方案,它适用于删除 '-w' 。 support.microsoft.com/en-us/help/3136780/…
  • @ChamathViduranga Thx,更新了我的答案以反映这一点。对于您的下一个问题,说明 RDBMS 和版本会有所帮助...
【解决方案2】:

我找到了解决办法

 +@uploadFolder + CAST(@PurchaseOrderID AS varchar(20))+'.xml' +' -T -N -w -c -C65001'

我从代码中删除了 -w。然后它工作。但它只适用于 Microsoft SQL Server 2014 (SP2-CU6) (KB4019094) - 12.0.5553.0 (X64)。

https://support.microsoft.com/en-us/help/3136780/utf-8-encoding-support-for-the-bcp-utility-and-bulk-insert-transact-sq

【讨论】:

    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多