2009-09-14 19 views
1

我需要將純文本列中的數據轉換爲xml列。但是,並非所有內容都是有效的XML,所以我需要忽略具有無效XML的任何行。有沒有一種方法可以使用某種內聯條件轉換或WHERE子句中的某些內容過濾掉無效數據?SQL Server:使用XML進行內聯條件轉換?

+0

什麼版本的SQL Server? – 2009-09-14 23:49:20

+0

SQL 2005 15char – 2009-09-15 00:10:07

回答

1

聽起來你需要爲XML數據提供ISNUMERIC函數的一個版本。

遺憾的是沒有這樣的內置函數存在 - 所以你必須設計出你自己的選擇,對其中有幾個選項:

如果這是一個一次性的或小規模的過程,其性能不是關鍵的,你可以在裏面光標每次處理的輸入表一排,用TRY...CATCH塊來處理無效的類型轉換(未經測試):或者

DECLARE xmlCur CURSOR FOR 
SELECT textcol 
FROM inputTable 

OPEN xmlCur 
DECLARE @string nvarchar(MAX) 
DECLARE @xml xml 

FETCH NEXT FROM xmlCur into @string 

WHILE @@fetch_status = 0 
BEGIN 
    BEGIN TRY 
     SET @xml = CAST(@string AS XML) 
     -- Do something with XML 
    END TRY 
    BEGIN CATCH 
     -- log failure/mark source row as invalid 
    END CATCH 

    FETCH NEXT FROM xmlCur into @string 
END 

CLOSE xmlCur 
DEALLOCATE xmlCur 

,如果你熟悉的.Net編程(並在您的服務器上啓用它),您可以使用CLR來創建您自己的IsXML函數。 .Net代碼將不會比this thread上的第三個帖子複雜得多。

CLR解決方案的性能可能不如遊標更好 - 您需要測試以確定這一點。

(一個顯而易見的嘗試,它不起作用,是一個標量值T-SQL函數,它試圖在TRY...CATCH塊內將字段轉換爲XML,但TRY...CATCH在函數內部是不允許的。

+0

遊標解決方案就是我已經完成的,所以榮譽:D – 2009-09-15 15:19:33