[英]bcp queryout xml format file encoding utf-8 xml file validation fail
我必須生成格式為“ =“ 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
查看您的代碼,我得到的是[sql-server]
...
SQL Server的VARCHAR
類型是1字節編碼的擴展ASCII (取決於相關的COLLATION
),而不是UTF-8
...
每當SQL Server談論unicode時,它就是本機NVARCHAR
或NCHAR
類型,它是2字節編碼的字符串 (實際上是UCS-2
)。
此外,您正在說明一些開關
-N
:在任何情況下都使用本機類型,對字符使用unicode 。 -w
:顯式開關以使用unicode -C
:頁面為65001( utf-8
),而文檔明確告訴您, 此代碼頁不受支持! 。 如果其他都沒問題,則您的代碼應在磁盤上放置一個2字節unicode的文件 ,但大喊:“我是UTF-8!”。 對XML聲明中的UTF-16
嘗試相同的操作。 或者,您可以使用任何其他工具將SQL Server的輸出轉換為您選擇的編碼。
我傾向於C#:直接從SQL-Server(根本沒有BCP)將XML讀入.NET字符串(總是unicode!),然后使用適當的編碼將.Net字符串寫入文件。
在給定的鏈接( SQL Server 2014的BCP文檔 )中,仍然有
**重要** SQL Server不支持代碼頁65001(UTF-8編碼)。
但是對於2016+版本,您可以找到以下代碼:
版本13之前的版本(SQL Server 2016(13.x))不支持代碼頁65001(UTF-8編碼)。 以13開頭的版本可以將UTF-8編碼導入到SQL Server的早期版本。
但是2014-SP2實際上將此添加到v2014中( 知識庫文章3136780 )。 因此,文檔未涵蓋此向后增強。
使用此組合而不使用-N -w
可以導出UTF-8:
-c -C65001
我找到了解決方案
+@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)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.