【问题标题】:Nesting of FOR XML ExpressionsFOR XML 表达式的嵌套
【发布时间】:2011-02-18 08:34:43
【问题描述】:

我尝试了一个类似于 here 在副标题“FOR XML 表达式的嵌套”下显示的 FOR XML 查询。我的问题是我必须拥有三个 XML 元素级别。结果应该是这样的。

<StepTree Name="ALFKI">
  <Step Name="Foo">
    <Result id="123" />
    <Result id="456" />
  </Step>
  <Step Name="Bar">
    <Result id="789" />
    <Result id="987" />
  </Step>
</StepTree >

我尝试过这种类型的查询。

SELECT 1 as TAG,
       NULL as Parent,
       StepTrees.Name AS [StepTree!1!Name],
       NULL as [Step!2!Name],
       NULL as [Result!3!id]
FROM StepTrees
WHERE StepTrees.Name = 'ALFKI' 
UNION ALL
SELECT 2,
       1,
       StepTrees.Name,
       Steps.Name,
       NULL
FROM Steps
JOIN StepTrees ON Steps.StepTreeId = StepTrees.Id
WHERE StepTrees.Name = 'ALFKI' 
UNION ALL
SELECT DISTINCT 3,
       2,
       StepTrees.Name,
       Steps.Name,
       Results.id
FROM StepTrees
JOIN Steps ON Steps.StepTreeId = StepTrees.Id
JOIN Results ON Steps.StepId = Results.StepId
FOR XML EXPLICIT

生成的 XML 如下。

<StepTree Name="ALFKI">
  <Step Name="Foo" />
  <Step Name="Bar">
    <Result id="123" />
    <Result id="456" />
    <Result id="789" />
    <Result id="987" />
  </Step>
</StepTree >

有什么想法吗?

【问题讨论】:

    标签: tsql for-xml


    【解决方案1】:

    使用这个查询:

    SELECT 1 as TAG,
       NULL as Parent,
       StepTrees.Name AS [StepTree!1!Name],
       NULL as [Step!2!Name],
       NULL as [Result!3!id]
    FROM StepTrees
    WHERE StepTrees.Name = 'ALFKI' 
    UNION ALL
    SELECT 2,
           1,
           Null,
           Steps.Name,
           NULL
    FROM Steps
    JOIN StepTrees ON Steps.StepTreeId = StepTrees.Id
    WHERE StepTrees.Name = 'ALFKI' 
    UNION ALL
    SELECT DISTINCT 3,
           2,
           Null,
           Steps.Name,
           Results.id
    FROM StepTrees
    JOIN Steps ON Steps.StepTreeId = StepTrees.Id
    JOIN Results ON Steps.StepId = Results.StepId
    ORDER BY [Step!2!Name],[Result!3!id]
    FOR XML EXPLICIT
    

    【讨论】:

    • 是的,只要我在最后一个 SELECT 中添加相同的 WHERE 子句,它就可以工作。不知道 ORBER BY 对 XML 形状的影响。非常感谢。 ——卢比奥
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    相关资源
    最近更新 更多