【问题标题】:Sql Server FOR XML - encoding result to prevent malformed xmlSql Server FOR XML - 编码结果以防止格式错误的 xml
【发布时间】:2012-07-18 13:10:23
【问题描述】:

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

【问题讨论】:

  • 您为什么不对其进行测试并将其中的一些数据放入您的表中? :) 此外,您可能想要的是查看 CDATA 标记。不知道您是否可以通过查询或其他方式添加它们..

标签: sql sql-server sql-server-2008 for-xml


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多