2013-05-02 59 views
0

我試圖設計一個查詢來查找EMR數據庫中的審覈日誌。問題是審計信息存儲在一個varchar列中,有時候它只是發生了什麼(我不在乎)的文本描述,有時候它包含有效的XML(我知道這是一個設計缺陷,但我可以不會改變它,因爲我沒有創建EMR)將varchar轉換爲XML並解析XML失敗

我創建了一個表值函數來解析xml並返回數據,但是select語句無法執行,因爲有時函數中的xml轉換失敗。我無法對函數中的轉換進行嘗試/捕獲,我可以從函數調用存儲過程以使用try/catch進行轉換,所以我不確定該如何處理。

選擇頂部1 *從與(NOLOCK)審計 外申請dbo.cus_GetDeletedAttachmentInfo(Audit.Audituid)作爲詳細

ERROR XML分析:行1中,字符136,非法XML字符

+0

這是MS SQL Server的?什麼版本? – EkoostikMartin 2013-05-02 15:48:17

+0

MS SQL Server 2012 – Kynrek 2013-05-02 20:54:33

回答

1

您在你的標記中有一個非法字符,你需要在嘗試轉換爲xml時潛在捕獲。我做了這樣的事情:

declare @Text varchar(max); 

select @Text = '<root><stuff>&</stuff></root>' 


begin try 
    select Cast(@Text as xml) 
end try 
begin catch 
    Select Error_message() 

    Select 'Let''s account for ampersand manually by converting' 

    select cast(replace(@Text, '&', '&amp;') as xml) 
end catch 

你需要考慮像&符號和其他字符的東西都沒有標註起來,否則鑄件的默認行爲或SQL服務器轉換爲失敗,並說明爲什麼有故障。 XML需要標記特殊字符。一般來說有喜歡這裏的標記列表(沒有嘗試過所有這些,因爲這只是一個例子):

http://rabbit.eng.miami.edu/info/htmlchars.html

+0

它可能沒有任何非法字符,也不是有效的XML。仍在轉換是朝着正確方向邁出的一步。 +1 – Paparazzi 2013-05-02 17:01:31

+0

我現在正在得到另一個錯誤XML解析:第1行,第39個字符,無法切換編碼 – Kynrek 2013-05-02 17:22:14

+0

您需要通過考慮許多潛在的無效字符來確定數據是否爲有效的XML。我的例子只是一個最常見的例子,通常有人在字符串字段中加入&符號。你總是可以發佈varchar字段,我們可以嘗試以這種方式解決它。我會編寫一個過程來嘗試在try/catch塊中嘗試許多替換選項的轉換。有時候Blam在上面說過,你真的有無效的xml。當有人提供文本而不把它放在驗證器周圍時,這是問題,它沒有要求是合法的xml。 – djangojazz 2013-05-02 17:38:50