2017-11-15 2 views
0

Nach diesem question, muss ich das select-Ergebnis in eine XML-Variable. So vermeiden Sie die Fehlermeldung "Die FOR XML- und FOR JSON-Klauseln sind in Sichten, Inline-Funktionen, abgeleiteten Tabellen und Unterabfragen ungültig, wenn sie einen Mengenoperator enthalten. Umwickeln Sie den SELECT-Operator, der einen Mengenoperator enthält, mithilfe der abgeleiteten Tabelle oder einen gemeinsamen Tabellenausdruck oder betrachten und wenden Sie FOR XML oder JSON darüber an. ", bitte?SQL Server XML-Ausgabe mit CDATA in XML-Variable

Hier ist der Testcode:

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 

Und hier ein Beispiel dafür, was ich tun möchte:

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) 

Antwort

0

Das ist schwierig ...

Sie können die UNION ALL Teil bewegen zu einem CTE wie hier. Das Problem ist nicht die FOR XML aber Rahter die UNION (vorsicht, könnte es notwendig sein, eine ORDER BY Klausel hinzugefügt werden):

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; 

Und Sie sollten sich bewusst sein, dass CDATA sowie FOR XML EXPLICIT veraltet sind. Verwenden Sie stattdessen FOR XML PATH() und zum Lesen der entsprechenden methods the XML data type provides.

Sie might read this und lesen Sie auch die folgenden Links!