2017-11-15 12 views
0

このquestionに続いて、xml変数にselect結果を入れる必要があります。このエラーメッセージを回避する方法 "FOR XMLおよびFOR JSON句は、ビュー、インライン関数、派生テーブル、サブクエリにセット演算子が含まれている場合は無効です。回避するには、派生テーブルを使用してセット演算子を含むSELECTをラップしますまたは共通の表の式またはビューを使用し、その上にFOR XMLまたはFOR JSONを適用してください。 "xml変数にCDATAを含むSQL Server XML出力

ここでは、テストコード:

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 

そして、ここで私が何をしたいの例:

Declare @xml xml 
... 
set @xml= (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

これはトリッキーです...

あなたはUNION ALL一部を移動することができますここのようなCTEに問題はFOR XMLではなくrahter UNION(気をつけても、ORDER BY句を追加する必要があるかもしれません):

DECLARE @xml XML; 

WITH UnionAllCte AS 
(
    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 
) 
SELECT @xml= 
(
    SELECT * FROM UnionAllCte 
    FOR XML EXPLICIT 
) 

SELECT @xml; 

そして、あなたはCDATAだけでなく、​​が時代遅れであることを、認識すべきです。むしろFOR XML PATH()を使用し、適切なmethods the XML data type providesを読むために使用してください。

あなたmight read thisと以下のリンクも読んでください!