我有一些存儲在varchar列中的有效和無效的xml值。t-sql:將varchar轉換爲xml
我想將有效的xml值轉換爲實際的xml數據類型,並將其無效化爲空值。
這樣做的好方法是什麼?
喜歡的東西:
SELECT
CASE WHEN dbo.isValidXML(xml_data) THEN CAST(xml_data as XML)
ELSE null
END
我有一些存儲在varchar列中的有效和無效的xml值。t-sql:將varchar轉換爲xml
我想將有效的xml值轉換爲實際的xml數據類型,並將其無效化爲空值。
這樣做的好方法是什麼?
喜歡的東西:
SELECT
CASE WHEN dbo.isValidXML(xml_data) THEN CAST(xml_data as XML)
ELSE null
END
如果你需要保持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
爲每個查詢。
是的,但我的問題的牛肉是我怎麼檢查XML是有效的第一個地方? – David
'我有一些存儲在varchar列中的有效和無效的xml值。「 - 這是您控制下的存儲步驟嗎?或者你是否在預先填充的表中查詢? – christiandev
預填充表。基本上,我需要一種方法來檢查使用t-sql的XML字符串有效性。 – David
在響應僅此:
是的,但我的問題的牛肉是我如何檢查是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。
感謝您指向其他線程的鏈接,它建議手動解析相關令牌。這就是我最終做的。 – Alan
嘗試使用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
什麼版本的SQL Server? –
Microsoft SQL Server 2008(SP1) – David
您是否可以在加載此數據的過程中運行進程來拒絕無效的XML,否則每次使用此select語句時都通過函數運行此查詢性能的理想選擇。 – christiandev