我必须为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
答案 0 :(得分:0)
查看您的代码我得到的是[sql-server]
...
SQL-Server的VARCHAR
- 类型是 1字节编码的扩展ASCII (取决于关联的COLLATION
)而不是UTF-8
... < / p>
每当SQL-Server谈论 unicode 时,它就是本机NVARCHAR
或NCHAR
类型,它是 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)。