1

SQL SERVER2008R2を使用しています。FORXMLを使用して結果を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 に答える