sql - sql 中的 xml select 出现问题 - 似乎无法按正确的顺序组织多个节点

标签 sql xml t-sql stored-procedures xsd

这是我的代码,我正在尝试在 XML 中进行简单的 3 个节点选择,但它不起作用,我正在获取父节点、第二个节点(所有节点),然后是第三个节点(所有节点) (类别->类别(全部)->产品(全部)且顺序不正确(类别->类别->该类别的所有产品)

    select  1       as  tag,
        null    as  parent,

        null    as  [Categories!1],

        null    as  [Category!2!ID],
        null    as  [Category!2!Name],
        null    as  [Product!3!ID],
        null    as  [Product!3!Name],
        null    as  [Product!3!Price]

union all

select  2       as  tag,
        1       as  parent,

        null,
        CategoryID,
        CategoryName,
        NULL,
        NULL,
        NULL

from    dbo.Categories

union all

select  3       as  tag,
        2       as  parent,

        null,
        null,
        null,
        ProductID,
        ProductName,
        UnitPrice

from    dbo.Products
where   CategoryID=CategoryID

for xml explicit

如果有人知道我做错了什么,那就太好了。 谢谢你, 埃雷兹

最佳答案

SQL Server 2005 及更高版本有一个非常强大的新命令 - FOR XML PATH - 它比以前的 FOR XML EXPLICIT 更容易使用。

我不知道你到底想要什么,但你可以这样做:

SELECT
    cat.CategoryID AS '@CategoryID',
    cat.CategoryName AS 'Category/Name',
    pr.ProductID AS '@ProductID',
    pr.ProductName  'Product/Name',
    pr.UnitPrice
FROM 
    dbo.Categories cat
INNER JOIN
    dbo.Products pr ON cat.CategoryID = pr.CategoryID
FOR XML PATH('ProductCategory'), ROOT('Root')

这应该给你类似的东西:

<Root>
  <ProductCategory CategoryID="5" ProductID="66">
     <Category>
        <Name>YourCategory Nr. 5</Name>
     </Category>
     <Product>
        <Name>Your Product Nr. 66</Name>
     </Product>
     <UnitPrice>50.50</UnitPrice>
  </ProductCategory>
</Root>

有关 FOR XML PATH 的更多信息,请参阅其中一些资源:

马克

更新:好的,现在我们知道您真正想要什么,我可以提供正确的答案:-)

SELECT
    cat.CategoryID AS '@ID',
    cat.CategoryName AS '@Name',
    (SELECT
         pr.ProductID AS '@ID',
         pr.ProductName AS '@Name',
         pr.UnitPrice AS '@Price'
     FROM
         dbo.T_Product pr
     WHERE 
         cat.CategoryID = pr.CategoryID
     FOR XML PATH('product'), TYPE
    )
FROM 
    dbo.Categories cat
FOR XML PATH('category'), ROOT('Categories')

这给了我输出(来自Northwind):

<Categories>
  <category ID="1" Name="Beverages">
    <product ID="1" Name="Chai" Price="18.0000" />
    <product ID="2" Name="Chang" Price="19.0000" />
    <product ID="24" Name="Guaraná Fantástica" Price="4.5000" />
    <product ID="34" Name="Sasquatch Ale" Price="14.0000" />
    <product ID="35" Name="Steeleye Stout" Price="18.0000" />
    <product ID="38" Name="Côte de Blaye" Price="263.5000" />
    <product ID="39" Name="Chartreuse verte" Price="18.0000" />
    <product ID="43" Name="Ipoh Coffee" Price="46.0000" />
    <product ID="67" Name="Laughing Lumberjack Lager" Price="14.0000" />
    <product ID="70" Name="Outback Lager" Price="15.0000" />
    <product ID="75" Name="Rhönbräu Klosterbier" Price="7.7500" />
    <product ID="76" Name="Lakkalikööri" Price="18.0000" />
  </category>
  <category ID="2" Name="Condiments">
    <product ID="3" Name="Aniseed Syrup" Price="10.0000" />
    <product ID="4" Name="Chef Anton's Cajun Seasoning" Price="22.0000" />
    <product ID="5" Name="Chef Anton's Gumbo Mix" Price="21.3500" />
    <product ID="6" Name="Grandma's Boysenberry Spread" Price="25.0000" />
    <product ID="8" Name="Northwoods Cranberry Sauce" Price="40.0000" />
    <product ID="15" Name="Genen Shouyu" Price="15.5000" />
    <product ID="44" Name="Gula Malacca" Price="19.4500" />

关于sql - sql 中的 xml select 出现问题 - 似乎无法按正确的顺序组织多个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1811954/

相关文章:

mysql - 如何为连接指定特定的列?

java - 比较两个表中的值并将从第一个表中获取的值插入到第二个表中

由于 "Cannot add or update a child row: foreign key constraint fails",MySQL .cs​​v 加载失败

c++ - _di_IXMLNode 中不需要的 xmlns =""

javascript - 尝试在 JavaScript 中解析 XML 中的所有数据

python - 复合 SQL INSERT 语句

sql - 在 TSQL 过程中使用 SYSNAME 数据类型

sql - 在 SQL 中编写 CASE 语句

t-sql - 将 dd/mm/yyyy 转换为 SQL Server 中的日期

c# - 在特殊的 xml 结构中选择具有名称属性名称的元素