【问题标题】:SQL Server XML output with CDATA into xml variable带有 CDATA 的 SQL Server XML 输出到 xml 变量中
【发布时间】:2017-11-15 20:28:48
【问题描述】:

question 之后,我需要将选择结果放入一个 xml 变量中。如何避免出现错误消息“当 FOR XML 和 FOR JSON 子句包含集合运算符时,它们在视图、内联函数、派生表和子查询中无效。要解决此问题,请使用派生表包装包含集合运算符的 SELECT或公用表表达式或视图,并在其上应用 FOR XML 或 FOR JSON。”,拜托?

这里是测试代码:

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)

【问题讨论】:

    标签: sql-server xml cdata


    【解决方案1】:

    这很棘手......

    您可以像这里一样将UNION ALL 部分移动到CTE。问题不在于FOR XML,而在于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;
    

    您应该知道,CDATAFOR XML EXPLICIT 已经过时了。而是使用FOR XML PATH() 并阅读适当的methods the XML data type provides

    might read this 并阅读以下链接!

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多