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

时间:2018-04-03 06:58:48

标签: sql xml utf-8 encode bcp

我必须为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 

2 个答案:

答案 0 :(得分:0)

查看您的代码我得到的是[sql-server] ...

SQL-Server的VARCHAR - 类型是 1字节编码的扩展ASCII (取决于关联的COLLATION)而不是UTF-8 ... < / p>

每当SQL-Server谈论 unicode 时,它就是本机NVARCHARNCHAR类型,它是 2字节编码的字符串(实际上UCS-2。)

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

  • -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)。所以文档没有涉及这种后向增强。

在没有-N -w的情况下使用此组合导出UTF-8应该有效:

-c -C65001

答案 1 :(得分:0)

我找到了解决方案

 +@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