示例:指定 ID 和 IDREFS 指令

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Microsoft Fabric 中的 SQL 数据库

可以将元素属性指定为 ID 类型属性,然后就可以使用 IDREFS 属性来引用它。 这将启用文档内链接,与关系数据库中主键和外键关系类似。

此示例说明如何使用 IDIDREFS 指令来创建 IDIDREFS 类型的属性。 因为 ID 不能是整数值,所以对此示例中的 ID 值进行了转换。 也就是说,它们进行了类型转换。 ID 值中使用了前缀。

假定要如下所示构造 XML:

<Customer CustomerID="C1" SalesOrderIDList=" O11 O22 O33..." >
    <SalesOrder SalesOrderID="O11" OrderDate="..." />
    <SalesOrder SalesOrderID="O22" OrderDate="..." />
    <SalesOrder SalesOrderID="O33" OrderDate="..." />
    ...
</Customer>

SalesOrderIDList 元素的 <Customer> 属性是一个多值属性,它引用 SalesOrderID 元素的 <SalesOrder> 属性。 若要建立此链接,必须将 SalesOrderID 属性声明为 ID 类型,并且必须将 SalesOrderIDList 元素的 <Customer> 属性声明为 IDREFS 类型。 因为一个客户可请求多个订单,所以使用 IDREFS 类型。

IDREFS 类型的元素也有多个值。 因此,必须使用单独的 SELECT 子句来重复使用相同的标记、父级和键列信息。 然后, ORDER BY 必须确保组成 IDREFS 值的行的序列成组显示在它们的父元素下。

下面是生成所需的 XML 的查询。 该查询使用 IDIDREFS 指令来覆盖列名称(SalesOrder!2!SalesOrderID!IDCustomer!1!SalesOrderIDList!IDREFS)中的类型。

USE AdventureWorks2022;
GO
SELECT  1 as Tag,
        0 as Parent,
        C.CustomerID   [Customer!1!CustomerID],
        NULL           [Customer!1!SalesOrderIDList!IDREFS],
        NULL           [SalesOrder!2!SalesOrderID!ID],
        NULL           [SalesOrder!2!OrderDate]
FROM   Sales.Customer C

UNION ALL
SELECT  1 as Tag,
        0 as Parent,
        C.CustomerID,
        'O-'+CAST(SalesOrderID as varchar(10)),
        NULL,
        NULL
FROM   Sales.Customer AS C
INNER JOIN Sales.SalesOrderHeader AS SOH
    ON  C.CustomerID = SOH.CustomerID

UNION ALL
SELECT 2 as Tag,
       1 as Parent,
        C.CustomerID,
        NULL,
        'O-'+CAST(SalesOrderID as varchar(10)),
        OrderDate
FROM   Sales.Customer AS C
INNER JOIN Sales.SalesOrderHeader AS SOH
    ON  C.CustomerID = SOH.CustomerID
ORDER BY [Customer!1!CustomerID] ,
         [SalesOrder!2!SalesOrderID!ID],
         [Customer!1!SalesOrderIDList!IDREFS]
FOR XML EXPLICIT;

另请参阅