Как вставить набор строк и сгенерированный 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)

2 ответа

Решение
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

Вы должны добавить имя и идентификатор в список выбора

ВЫБЕРИТЕ PersonID, Имя,

Также необходимо включить имя в операторе выбора CTE

о / р

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

Просто добавьте его, чтобы выбрать:

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>
Другие вопросы по тегам