2015-04-28 80 views
2

我正在生成的示例表和生成的xml具有使用CTE插入一组行和xml生成的列的从它如何通过使用CTE到一个表中单个查询

declare @t table (ID int, PersonID int, Type varchar(10), Name varchar(10),        
Category varchar(10), value int) 
insert @t values 
(1, 1234, 'xtype', 'John', 'abc', 200), 
(2, 1234, 'ytype', 'John', 'xyz', 230), 
(3, 1234, 'ztype', 'John', 'ccc', 220), 
(4, 2222, 'xtype', 'Jim', 'abc', 200), 
(5, 3333, 'xtype', 'Tim', 'abc', 500) 

; with cte 
as (
select distinct PersonID from @t 
) 
select 
(select 
    PersonID, 
    (select 
     Type, 
     Name, 
     category, 
     value 
    from 
     @t t 
    where 
     t.PersonID = cteInner.PersonID 
    for xml path('SpecifiedType'), type) 
from 
    cte cteInner 
where 
    cteInner.PersonID = cteOuter.PersonID 
for xml path(''), type, root('data')) as xmldetail 
from 
cte cteOuter 

现在我要插入的下面的数据到另一个表包括XML,我创建数据

Example Table 
    PersonID Name   xmldetail 
    1234  John  (GeneratedXmlFrom using cte) 
    2222  Jim   (GeneratedXmlFrom using cte) 
    3333  Tim   (GeneratedXmlFrom using cte) 

回答

1
declare @t table (ID int, PersonID int, Type varchar(10), Name varchar(10),        
Category varchar(10), value int) 
insert @t values 
(1, 1234, 'xtype', 'John', 'abc', 200), 
(2, 1234, 'ytype', 'John', 'xyz', 230), 
(3, 1234, 'ztype', 'John', 'ccc', 220), 
(4, 2222, 'xtype', 'Jim', 'abc', 200), 
(5, 3333, 'xtype', 'Tim', 'abc', 500) 
;WITH cte 
AS (
    SELECT DISTINCT PersonID 
     ,NAME 
    FROM @t 
    ) 
insert into TABLENAME 
SELECT PersonID 
    ,NAME 
    ,(
     SELECT PersonID 
      ,(
       SELECT Type 
        ,NAME 
        ,category 
        ,value 
       FROM @t t 
       WHERE t.PersonID = cteInner.PersonID 
       FOR XML PATH('SpecifiedType') 
        ,TYPE 
       ) 
     FROM cte cteInner 
     WHERE cteInner.PersonID = cteOuter.PersonID 
     FOR XML PATH('') 
      ,TYPE 
      ,ROOT('data') 
     ) AS xmldetail 
FROM cte cteOuter 

你必须在选择列表中添加名称和ID

SELECT是PersonID,名称,

还必须包括名称在CTE的SELECT语句

o/p

1234 John <data><PersonID>1234</PersonID><SpecifiedType><Type>xtype</Type><Name>John</Name><category>abc</category><value>200</value></SpecifiedType><SpecifiedType><Type>ytype</Type><Name>John</Name><category>xyz</category><value>230</value></SpecifiedType><SpecifiedType><Type>ztype</Type><Name>John</Name><category>ccc</category><value>220</value></SpecifiedType></data> 
2222 Jim  <data><PersonID>2222</PersonID><SpecifiedType><Type>xtype</Type><Name>Jim</Name><category>abc</category><value>200</value></SpecifiedType></data> 
3333 Tim  <data><PersonID>3333</PersonID><SpecifiedType><Type>xtype</Type><Name>Tim</Name><category>abc</category><value>500</value></SpecifiedType></data> 

要插入值到另一个表使用insert into TABLENAME

+0

感谢,它的工作 – user3494425

+0

INSERT INTO表名 ([是PersonID] ,[名] ,[xmldetail]) 选择* from cte – user3494425

+0

我无法插入表中,我写了下面的插入语句,但没有插入,请你帮我 – user3494425

1

的其它列,只要把它添加到选择:

WITH cte 
      AS (SELECT DISTINCT 
         PersonID, 
         Name      
       FROM  @t 
      ) 
    SELECT PersonID, Name, (SELECT PersonID , 
         (SELECT Type , 
            Name , 
            category , 
            value 
          FROM  @t t 
          WHERE  t.PersonID = cteInner.PersonID 
         FOR 
          XML PATH('SpecifiedType') , 
           TYPE 
         ) 
       FROM  cte cteInner 
       WHERE  cteInner.PersonID = cteOuter.PersonID 
      FOR 
       XML PATH('') , 
        TYPE , 
        ROOT('data') 
      ) AS xmldetail 
    FROM cte cteOuter 

输出:

PersonID Name xmldetail 
1234 John <data><PersonID>1234</PersonID><Name>John</Name><SpecifiedType><Type>xtype</Type><Name>John</Name><category>abc</category><value>200</value></SpecifiedType><SpecifiedType><Type>ytype</Type><Name>John</Name><category>xyz</category><value>230</value></SpecifiedType><SpecifiedType><Type>ztype</Type><Name>John</Name><category>ccc</category><value>220</value></SpecifiedType></data> 
2222 Jim <data><PersonID>2222</PersonID><Name>Jim</Name><SpecifiedType><Type>xtype</Type><Name>Jim</Name><category>abc</category><value>200</value></SpecifiedType></data> 
3333 Tim <data><PersonID>3333</PersonID><Name>Tim</Name><SpecifiedType><Type>xtype</Type><Name>Tim</Name><category>abc</category><value>500</value></SpecifiedType></data> 
+0

感谢,它的工作 – user3494425

相关问题