SQL 2005 TIPS - Convert NText To Xml Data Type

使用SSMS SELECT XmlStringCol FROM myTable,發現由於SSRS的結果字元數限制(65535個字元),在結果視窗複製欄位內容再到Notepad貼上,XML的後半截不見了。

雖然這個限制可以修改(如下圖),但一時想要展現高超的T-SQL指令技巧,我決定把它轉成XML,如此可以閃過長度限制,還可以直接在SSMS中檢視XML內容,一舉兩得。

噹!! (痛)

我踢到鐵板了!

XmlString是一個NText欄位,裡面放存放的內容來自*.xml的讀取內容,試著將XmlStringCol轉成XML會發生錯誤:

SELECT TOP 1 CONVERT(XML, XmlString) FROM myTable

Msg 9402, Level 16, State 1, Line 1
XML parsing: line 1, character 38, unable to switch the encoding

經過一番測試,總算明白問題出在哪了。從*.xml中讀出的內容,第一列放的是XML宣告<?xml version="1.0" encoding="UTF-8"?>,而記得嗎? SQL中一向是用UCS-2儲存資料的,這形成一個矛盾: 明明Encoding是UCS-2,但XML內容卻又宣稱自己是UTF-8,導致了轉換失敗。

我想到的解決方法是去掉encoding屬性,讓SQL自行看著辦,但由於欄位是NText,必須要轉成NVarChar(MAX)才可動用Replace狸貓換太子,於是指令要改成:

SELECT TOP 1 CONVERT(XML, REPLACE(CONVERT(NVARCHAR(MAX), XmlString), 'encoding="UTF-8"', '')) FROM myTable

搞定收工!

歡迎推文分享:
Published 18 September 2008 08:21 AM 由 Jeffrey
Filed under:
Views: 13,422



意見

# singular said on 17 September, 2008 08:24 PM

最後完成的SQL指令是不是有少一個")" 右括弧 ?

# Jeffrey said on 17 September, 2008 11:50 PM

to singular, 的確漏了,謝謝指正!

# chicken said on 19 September, 2008 02:33 AM

這類鐵板我也踢過好幾次 :~

最後結論是,除非你能精確控制儲存 XML 的 storage 用的編碼 (比如自己存檔案),否則千萬別自己加上這段 PI 宣告..

碰過其它是 HTML FORM POST 過來的 XML,明明只放字串,也是硬被加上編碼的宣告,最後抓半天才抓到問題 -_-

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<September 2008>
SunMonTueWedThuFriSat
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication