bcp queryout xml 格式文件编码 utf-8 xml 文件验证失败

bcp queryout xml format file encoding utf-8 xml file validation fail

我必须生成编码格式为 xml 的文件 =“UTF-8。我使用了 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 

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

SQL-Server的VARCHAR-类型是1-byte-encoded扩展ASCII(取决于关联的COLLATION)而不是 UTF-8...

每当 SQL-Server 谈论 unicode 时,它是本机 NVARCHARNCHAR 类型,即 2-byte-encoded 字符串(实际上UCS-2)。

此外,您还说明了一些开关

  • -N:在任何情况下都使用本机类型,对字符使用 unicode
  • -w:显式切换到使用 unicode
  • -C:第 65001 页 (utf-8),而文档明确告诉您 this codepage is not supported!.

如果其余的没问题,您的代码应该在磁盘上放置一个文件,该文件是 2-byte-unicode,但正在大喊:"I'm UTF-8!"。在 XML 的声明中对 UTF-16 进行同样的尝试。或者,您可以使用任何其他工具将 SQL-Server 的输出转换为您选择的编码。

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

更新

在给定的 link (BCP documentation for SQL Server 2014) 处仍有

** Important ** SQL Server does not support code page 65001 (UTF-8 encoding).

但是对于 2016+ 版本你可以找到这个:

Versions prior to version 13 ( SQL Server 2016 (13.x)) do not support code page 65001 (UTF-8 encoding). Versions beginning with 13 can import UTF-8 encoding to earlier versions of SQL Server.

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

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

-c -C65001

我找到了解决方案

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

我从代码中删除了 -w。然后就可以了。但它只适用于 微软 SQL 服务器 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