2013-07-30 63 views
8

我有一些存儲在varchar列中的有效和無效的xml值。t-sql:將varchar轉換爲xml

我想將有效的xml值轉換爲實際的xml數據類型,並將其無效化爲空值。

這樣做的好方法是什麼?

喜歡的東西:

SELECT 
    CASE WHEN dbo.isValidXML(xml_data) THEN CAST(xml_data as XML) 
    ELSE null 
END 
+0

什麼版本的SQL Server? –

+0

Microsoft SQL Server 2008(SP1) – David

+1

您是否可以在加載此數據的過程中運行進程來拒絕無效的XML,否則每次使用此select語句時都通過函數運行此查詢性能的理想選擇。 – christiandev

回答

0

如果你需要保持XML是否有效或無效,你可以有像IsValid (bit)桌上標誌。然後,加載過程可以對此數據進行一次性檢查,以檢查XML是否有效,並根據結果設置標誌。這樣,您就可以通過查詢得到有效的XML:

SELECT 
    CASE WHEN IsValid = 1 THEN CAST(xml_data as XML) 
    ELSE null 
END 

如果您不需要保留無效的XML,那麼就裝載過程中拒絕它,該字段設置爲NULL,所以查詢看起來像:

SELECT 
    CASE WHEN xml_data IS NOT NULL THEN CAST(xml_data as XML) 
    ELSE null 
END 

兩種方式都將提供更好的性能是經過SQL function每個查詢

+1

是的,但我的問題的牛肉是我怎麼檢查XML是有效的第一個地方? – David

+0

'我有一些存儲在varchar列中的有效和無效的xml值。「 - 這是您控制下的存儲步驟嗎?或者你是否在預先填充的表中查詢? – christiandev

+0

預填充表。基本上,我需要一種方法來檢查使用t-sql的XML字符串有效性。 – David

4

在響應僅此:

是的,但我的問題的牛肉是我如何檢查是XML是有效的在 擺在首位?

在某種意義上你的XML無效,你會得到像這樣下方的第二行一休:

SELECT CAST('<xml>Yep this is xml</xml>' AS XML) 
SELECT CAST('<xml>Nope, not xml</x' AS XML) 

一個解決方案我看到的是一個行由行的方法,你試試和CAST一行爲XML,如果它轉換爲XML成功地將有效行插入到具有有效XML值的表中,如果它不能正確轉換,則不會插入該值。 See this thread for examples

+1

感謝您指向其他線程的鏈接,它建議手動解析相關令牌。這就是我最終做的。 – Alan

1

嘗試使用sp_xml_preparedocument -

SET NOCOUNT ON; 

DECLARE @XML NVARCHAR(MAX) 
SELECT @XML = '<t>test</' 

DECLARE @hDoc INT 

BEGIN TRY 

    EXEC sys.sp_xml_preparedocument @hDoc OUTPUT, @XML 
    SELECT '"' + @XML + '" is valid' 
    EXEC sys.sp_xml_removedocument @hDoc 

END TRY 
BEGIN CATCH 
    SELECT '"' + @XML + '" is invalid'  
END CATCH 

SELECT @XML = '<t>test</t>' 

BEGIN TRY 

    EXEC sys.sp_xml_preparedocument @hDoc OUTPUT, @XML 
    SELECT '"' + @XML + '" is valid' 
    EXEC sys.sp_xml_removedocument @hDoc 

END TRY 
BEGIN CATCH 
    SELECT '"' + @XML + '" is invalid'  
END CATCH 

輸出 -

------------------------- 
"<t>test</" is invalid 

------------------------- 
"<t>test</t>" is valid