在FOR XML子句中分组XML元素

时间:2015-03-19 01:24:16

标签: sql-server select-for-xml

我正在尝试从临时表中创建一个结构xml文档。临时表格式如下。

CREATE TABLE #Temp1 ( Name Char( 30 ), seqid integer, salary int );
INSERT INTO #Temp1 VALUES('DEAL' ,123,6)
INSERT INTO #Temp1 VALUES('DEAL' ,56,6)
INSERT INTO #Temp1 VALUES('TRACNHE' ,1253,56)
INSERT INTO #Temp1 VALUES('TRACNHE' ,5,65)
INSERT INTO #Temp1 VALUES('ASSET' ,56,23)

我正在尝试以下列形式创建xml格式:

<Response>
<Deal>
 <seqid="123" salary="6" />
 <seqid="56" salary="6" />
<Deal>
<TRACNHE>
 <seqid="1253" salary="56"/>
 <seqid="5" salary="65"/>
</TRACNHE>
<ASSET>
 <seqid="56" salary="23"/>
</ASSET>
</Response>

SELECT Name, (SELECT SEQID FROM #TEMP1 T WHERE T.Name = T1.Name)
FROM (SELECT DISTINCT NAME FROM #TEMP1 ) T1
FOR XML PATH('rEPONSE')
DROP TABLE #Temp1


DROP TABLE #Temp1

我尝试了上面的查询但是说子查询返回的值超过1 你能否告诉我这个查询中缺少的内容? 有没有更好的方法来处理这种情况。

提前致谢

1 个答案:

答案 0 :(得分:0)

根据您的要求,我发现有两种类型的复杂性

  • 您正在尝试使用分组项目获取xml。
  • 对于尝试创建具有两个属性的xml元素的每个组 没有任何正确的名字
    &lt; seqid =“1253”salary =“56”/&gt; 而不是
    &lt; ss seqid =“1253”salary =“56”/&gt;

只需查看以下查询,可能会有所帮助

SELECT 
    (SELECT
        seqid 'ss/@seqid'
       , salary 'ss/@salary'
      FROM Temp1 as t where t.Name = 'Deal'
      FOR XML PATH('Deal') , TYPE
    )  ,
    (SELECT
        seqid 'ss/@seqid'
       , salary 'ss/@salary'
      FROM Temp1 as t where t.Name = 'TRACNHE'
      FOR XML PATH('TRACNHE') , TYPE
    )   ,
    (SELECT
        seqid 'ss/@seqid'
       , salary 'ss/@salary'
      FROM Temp1 as t where t.Name = 'ASSET'
      FOR XML PATH('ASSET') , TYPE
    )  
FOR XML PATH(''), ROOT('Response');