sql - 如何使用 CTE 将一组行和 xml 生成的列插入到单个查询中的表中

标签 sql xml sql-server-2008 common-table-expression

我正在生成示例表并使用 cte 从中生成 xml

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)

最佳答案

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 选择语句中包含 Name

对/对

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

关于sql - 如何使用 CTE 将一组行和 xml 生成的列插入到单个查询中的表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29921553/

相关文章:

php - 使用 MySQL 进行 SQL 注入(inject)(一个有趣的挑战)

mysql - 如何仅对最后 `n` 行进行分组?

mysql - 为什么 find_in_set 有效但 IN 子句

sql-server-2008 - SQL Server Set变量(如果存在),否则插入到表中

c# - 支持索引 View 的 session 设置

c# - 需要获取当前网络服务器名称

sql - 为什么 Oracle 不因缺少 GROUP BY 子句而抛出错误消息?

xml - 有没有办法在应用程序设置中使用字典或 xml?

Android Studio XML 需要 Layout_Height 和 Layout_Width

xml - 尝试创建通用 XSL 以允许略有不同的 XML 格式