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 时,它是本机 NVARCHAR
或 NCHAR
类型,即 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)。
我必须生成编码格式为 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 时,它是本机 NVARCHAR
或 NCHAR
类型,即 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)。