sql-server - SQL Server XML添加多个不同类型的节点

标签 sql-server xml

我希望以此格式创建输出 xml,但无法在“子项”下添加“功能”和“类别”节点。我可以一次添加一个,但不能同时添加两个。

<Parent>
    <Child>
        <Features>
            <Feature Id="f1" />
            <Feature Id="f2" />
            <Feature Id="f3" />
        </Features>
        <Categories>
            <Category Name="c1">
                <Feature>f1</Feature>
                <Feature>f2</Feature>
            </Category>
            <Category Name="c2">
                <Feature>f2</Feature>
                <Feature>f3</Feature>
            </Category>
            <Category Name="c3">
                <Feature>f2</Feature>
            </Category>
    </Child>
</Parent>

这是我的 SQL,用于创建两个带有 <Features> 的 XML 字符串。节点和 <Category>节点:

DECLARE @CategoryFeatures TABLE (CategoryId VARCHAR(5), FeatureId VARCHAR(5))

INSERT INTO @CategoryFeatures VALUES ('c1', 'f1')
INSERT INTO @CategoryFeatures VALUES ('c1', 'f2')
INSERT INTO @CategoryFeatures VALUES ('c2', 'f2')
INSERT INTO @CategoryFeatures VALUES ('c2', 'f3')
INSERT INTO @CategoryFeatures VALUES ('c3', 'f2')

SELECT 
(
    SELECT
    (
        SELECT [@Id] = FeatureId
        FROM CategoryFeatures
        GROUP BY FeatureId
        FOR XML PATH ('Feature'), ROOT ('Features'), TYPE)
    FOR XML PATH ('Child'), TYPE)
FOR XML PATH ('Parent')


SELECT 
(
    SELECT
    (
        SELECT [@Name] = cat.CategoryId,
        (
            SELECT Feature = cf.FeatureId
            FROM CategoryFeatures cf
            WHERE cf.CategoryId = cat.CategoryId
            FOR XML PATH (''), TYPE)
        FROM CategoryFeatures cat
        GROUP BY cat.CategoryId
        FOR XML PATH ('Category'), ROOT ('Categories'), TYPE)
    FOR XML PATH ('Child'), TYPE)
FOR XML PATH ('Parent')

如何使这两个节点处于同一级别,使其看起来像上面的预期输出?谢谢。

最佳答案

一种可能性是子查询的狂欢。

SELECT (SELECT (SELECT cf1.featureid "Feature/@Id"
                       FROM (SELECT DISTINCT
                                    cf0.featureid
                                    FROM @categoryfeatures cf0) cf1
                       FOR XML PATH(''),
                               TYPE)
               FOR XML PATH('Features'),
                       TYPE),
       (SELECT (SELECT cf1.categoryid "Category/@Name",
                       (SELECT cf2.featureid "Feature"
                               FROM @categoryfeatures cf2
                               WHERE cf2.categoryid = cf1.categoryid
                               FOR XML PATH(''),
                                       TYPE) "Category"
                       FROM (SELECT DISTINCT
                                    cf0.categoryid
                                    FROM @categoryfeatures cf0) cf1
                       FOR XML PATH(''),
                               TYPE)
               FOR XML PATH('Categories'),
                       TYPE)
       FOR XML PATH('Child'),
               ROOT('Parent');

db<>fiddle

关于sql-server - SQL Server XML添加多个不同类型的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54356497/

相关文章:

sql-server - 确定 SQL Server 计划在一段时间内何时触发?

sql-server - alter table add bit column as case when 情况

sql-server - 如何从一张表读取另一张表 "subtract"?

php - linux系统可以使用哪些.so文件对应windows中的.dll文件来连接php到ms sql server

java - Eclipse 中的 log4j.xml

java - Android:不幸的是<应用程序名称>已停止

sql-server - SSIS 包格式 1 和 0

php - 创建TCP套接字连接并通过XML请求发送以便获得XML响应?

xml - SQLXML 将属性批量加载到单个表中

java - 如何在不使用 XMLReader 的情况下验证 SAXParser 中的 XML 文档?