示例:指定 ID 和 IDREFS 指令

适用于:SQL ServerAzure SQL 数据库Azure 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 类型,并且必须将 <Customer> 元素的 SalesOrderIDList 属性声明为 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;

另请参阅