XML路径错误输出

时间:2018-06-08 17:13:39

标签: sql-server xml

我的sproc中有以下选择查询:

select node1 =
(
    (select innernode1 = 
           (
            select var1 =
            (
                select
                Val     =   'XXX',  
                spec    =   'yyy'
                FOR XML PATH(''), TYPE
            )
             FOR XML PATH('var1'), TYPE
             )
    ),
    (select innernode1 = 
            (
            select  var2 =
            (
                    select
                    Val     =   'XXX',  
                    spec    =   'yyy'
                    FOR XML PATH(''), TYPE
            )
            FOR XML PATH('var2'), TYPE
            )
    )
)

期望/预期的XML输出:

    <?xml version="1.0" encoding="UTF-8"?>
<root>
   <node1>
      <innernode1>
         <var1>
            <Spec>yyy</Spec>
            <Val>xxx</Val>
         </var1>
      </innernode1>
      <innernode2>
         <var2>
            <Spec>yyy</Spec>
            <Val>xxx</Val>
         </var2>
      </innernode2>
   </node1>
</root>

但是,选择查询会在&#39;,&#39;附近抛出错误的语法。&#39;错误和&#39;)&#39;附近的语法不正确 任何帮助将非常感激!

1 个答案:

答案 0 :(得分:2)

FOR XML语句无效语法... 你想要实现什么目标?数据是来自表吗?

您想获得JSON,但是您正在创建XML?

一般提示:这可能仅适用于样本数据,但是 - 如果这是真实数据 - 则应避免名称编号。两者都应该只是innernode1,而不是innernode2innernode,而1和2要么取自他们的位置,要么作为属性/值放置。

我的魔法水晶球告诉我,你正在寻找这样的东西:

SELECT
            innernode1 =
            (
                SELECT
                Spec    =   'yyy',
                Val     =   'XXX'  
                FOR XML PATH('var1'), TYPE
            )
            ,innernode2 =
            (
                SELECT
                Spec    =   'yyy',
                Val     =   'XXX'  
                FOR XML PATH('var2'), TYPE
            )
FOR XML PATH('node1'),ROOT('root');

结果

<root>
  <node1>
    <innernode1>
      <var1>
        <Spec>yyy</Spec>
        <Val>XXX</Val>
      </var1>
    </innernode1>
    <innernode2>
      <var2>
        <Spec>yyy</Spec>
        <Val>XXX</Val>
      </var2>
    </innernode2>
  </node1>
</root>

FOR JSON声明(read here the documentation)看起来非常相似,但我目前无法测试。这需要SQL-Server-2017 +