2009-09-15 16 views
6

SQL Server XMLの戻り値としてCDATAを使用する方法はありますか?私はこれが必要としていた場合CDATAを使用したSQL Server XML出力

<locations> 
    <site id="124"> 
     <sitename>Texas A &amp; M</sitename> 
    </site> 
</locations> 

<locations> 
    <site id="124"> 
     <sitename><![CDATA[Texas A & M]]></sitename> 
    </site> 
</locations> 
+3

奇妙な要求のように見えます。どちらも標準に準拠したXMLパースエル。しかし、顧客は顧客です。 –

+0

残念ながら、SQLはすでに列データ(Texas A&M)を取得してXML(Texas A & M)を直接エスケープしているため、後処理はオプションではありません。 CDATAが許すもの。クライアントはXMLを解析し、値を検索して書き換えたくありません。そして私はすぐにクエリー・リターンを取ってXMLストリングを手作業で構築するのではなく、XMLを返すことが明確な好みであることをすぐに発見しました。 –

答えて

14

FOR XML EXPLICITのオプション(パラメータ)を見てください。より高度な制御が可能で、CDATAを指定することもできます。ここにはa good tutorialがあります。

そしてそのチュートリアルからaddaptedコード:ここで

declare @agent table 
( 
    AgentID int, 
    Fname varchar(5), 
    SSN varchar(11) 
) 

insert into @agent 
select 1, 'Vimal', '123-23-4521' union all 
select 2, 'Jacob', '321-52-4562' union all 
select 3, 'Tom', '252-52-4563' 

SELECT 
    1 AS Tag, 
    NULL AS Parent, 
    NULL AS 'Agents!1!', 
    NULL AS 'Agent!2!AgentID', 
    NULL AS 'Agent!2!Fname!Element', 
    NULL AS 'Agent!2!SSN!cdata' 
UNION ALL 
SELECT 
    2 AS Tag, 
    1 AS Parent, 
    NULL, 
    AgentID, 
    Fname, 
    SSN 
FROM @agent 
FOR XML EXPLICIT 
+0

これはお金の上にあった。助けてくれてありがとう。 –

+1

ただし、この出力をT-SQL XML変数またはXMLフィールドに挿入すると、CDATAはアンパサンドエスケープ形式に変換され、オフにすることはできません。 http://stackoverflow.com/a/9133622/864696 –

0

をジョエルは、上記のコメントで述べたように、これら二つの形式がまったく同じことを意味する必要があり、私はこのようにSQL ServerでXML返されてきました。しかし、CDATA形式が本当に必要な場合は、最初の形式を入力とし、CDATAを使用して2番目の形式を出力するポストプロセッサを記述することができます。

この場合、ポストプロセッサーは、の最初の形式のXMLエスケープデータをアンコードし、CDATA互換メソッドを使用して再エンコードします。 CDATAエスケープに関する考慮事項については、Is there a way to escape a CDATA end token in xml?の質問を参照してください。

0

はCDATAを得るための私の方法の例です。ここで

DECLARE @GlobalDateFormat varchar(32) 
SET @GlobalDateFormat = 'MM/dd/yyyy hh:mm tt' 

DECLARE @xml XML 

SET @xml = 
(
    SELECT 
      SegmentId   = ISNULL(SegmentId,0) 
     , DocumentId  = ISNULL(DocumentId,0) 
     , Title    = CAST(Core.dbo.fCharFormat('xmlCDATA',Title,DEFAULT,'') AS xml) 
     , DocumentShortName = CAST(Core.dbo.fCharFormat('xmlCDATA',DocumentShortName,DEFAULT,'') AS xml) 
     , [FileName]  = CAST(Core.dbo.fCharFormat('xmlCDATA',[FileName],DEFAULT,'') AS xml) 
     , [Path]   = CAST(Core.dbo.fCharFormat('xmlCDATA',[Path],DEFAULT,'') AS xml) 
     , CreateDate  = ISNULL(Core.dbo.fDateFormat(@GlobalDateFormat,CreateDate),Core.dbo.fDateFormat(@GlobalDateFormat,GETDATE())) 
     , ModificationDate = ISNULL(Core.dbo.fDateFormat(@GlobalDateFormat,ModificationDate),Core.dbo.fDateFormat(@GlobalDateFormat,GETDATE())) 
     , TemplateId  = ISNULL(CAST(TemplateId AS varchar(16)),'') 
     , IsRoot   = ISNULL(IsRoot,0) 
     , IsActive   = ISNULL(IsActive,0) 
     , SortOrdinal  = ISNULL(CAST(SortOrdinal AS varchar(16)),'') 
     , ClientId   = ISNULL(ClientId,'') 
     , Tag    = CAST(Core.dbo.fCharFormat('xmlCDATA',Tag,DEFAULT,'') AS xml) 
     FROM 
      Document 
     WHERE 
      DocumentId = 9073 
     FOR XML AUTO, ELEMENTS 
) 

SELECT @xml 

は私のイタチのような、CDATA-から関連の詳細です処理機能:

IF @cmdName = 'xmlCDATA' 
BEGIN 
    IF @chars IS NULL 
    BEGIN 
     SET @charsOut = @charsDefault 
    END 
    ELSE 
    BEGIN 
     SET @chars = REPLACE(@chars,'<![CDATA[','') 
     SET @chars = REPLACE(@chars,']]>','') 
     SET @charsOut = '<![CDATA[' + @chars + ']]>' 
    END 
END 
+0

これはあなたのデータのいずれかが失敗した場合、失敗します。タイトルは、文字列 ']]>'を含みます。 –

+0

おっと!右!私はCDATAに専念する関数を書く必要があります...終わりまでにそれを持つべきです... – rasx

+0

ちょっと待ってください 'Greg、私はこれをManagement Studioで試しました: SELECT CAST(' <![ CDATA [will]]これは失敗しますか?]]> 'AS xml) これを試しましたか?何が起こるのですか? – rasx

関連する問題