1

我正在使用 SQL SERVER 2008 R2。我有一个使用 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,但是到发生这种情况时会不会太晚了?如果有人可以就我应该如何处理这个问题提出一些建议,我将不胜感激。非常感谢。

4

1 回答 1

3

SQL-Server 会自动为您编码您的 XML。

例如

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

返回

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

如果您需要特殊字符,则需要在从 SQL-Server 请求它的任何层中解码您的 xml。

编辑

如果您确实想在字段中保留特殊字符,则需要使用 CDATA。这需要FOR XML EXPLICIT. 下面将保留特殊字符并返回您需要的 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
于 2012-07-18T13:17:39.957 回答