2017-11-15 2 views
0

question 다음에는 select 결과를 xml 변수에 넣어야합니다. "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 EXPLICIT 오래된 것을, 알고 있어야한다. 오히려 FOR XML PATH()을 사용하고 적절한 methods the XML data type provides을 읽으십시오.

might read this과 다음 링크도 읽어보십시오!