2012-07-18 37 views
1

我使用的是SQL SERVER 2008 R2。我有一個存儲過程,它使用FOR XML將結果作爲XML返回。這裏是存儲過程是什麼樣子:Sql Server FOR XML - 防止格式錯誤的xml的編碼結果

CREATE PROCEDURE [dbo].[myproc] 
(
    @ID int, 
) 
AS 
SET NOCOUNT ON 
BEGIN 
SELECT 
    t1.FirstField 
    t2.AnotherField 
    t1.ThirdField 
FROM table t1 
INNER JOIN table2 t2 ON t1.ID = t2.ID 
WHERE t1.id = @ID FOR XML RAW ('project'), ELEMENTS; 
END 

可正常工作,併產生這樣的XML:

<project> 
    <FirstField>First field data</FirstField> 
    <AnotherField> Another field data</AnotherField> 
    <ThirdField>Third field data</ThirdField> 
</project> 

這就是我想要的。然而我擔心的是,當XML中有特殊的字符時,如<和>會不會搞砸了,並使XML格式錯誤?有沒有辦法解決這個問題?我可以在調用這個存儲過程的代碼中進行一些檢查,看看它是否是有效的XML,但到了發生的時間不會太晚?如果任何人可以提出一些建議,我應該如何處理這個問題,我將不勝感激。非常感謝。

+1

爲什麼你不測試它,並把一些數據放在你的表中? :)此外,你想要的可能是看CDATA標籤。不知道你是否可以通過你的查詢或其他東西來添加它們.. – 2012-07-18 13:16:21

回答

3

SQL-Server將自動爲您編碼您的XML。

例如

SELECT '<xml>Test</xml>' 
FOR XML RAW ('Project'), ELEMENTS 

回報

<Project>&lt;xml&gt;Test&lt;/xml&gt;</Project> 

如果你希望你將需要在任何層由SQL-服務器請求它的XML解碼特殊字符。

編輯

如果你想保持領域內的特殊字符,你需要使用CDATA。這需要​​。以下內容將保留特殊字符並返回您需要的xml格式。

SELECT 1 AS Tag, 
     NULL AS Parent, 
     FirstField AS [Project!1!FirstField!cdata], 
     AnotherField AS [Project!1!AnotherField!Cdata], 
     ThirdField AS [Project!1!ThirdField!cdata] 
FROM table t1 
     INNER JOIN table2 t2 
      ON t1.ID = t2.ID 
WHERE t1.ID = @ID 
FOR XML EXPLICIT