示例:指定 ID 和 IDREFS 指令

元素属性可以指定为 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元素的属性是一个多值属性,它引用<SalesOrder>元素的SalesOrderID属性。 若要建立此链接,SalesOrderID必须声明该属性的类型ID,并且SalesOrderIDList元素的属性><Customer必须声明为IDREFS类型。 由于客户可以请求多个订单,因此使用了 IDREFS 类型。

类型的 IDREFS 元素还具有多个值。 因此,您必须使用一个独立的 SELECT 子句,该子句会重复使用相同的标记、父级和键列信息。 ORDER BY然后,必须确保构成IDREFS值的行序列被在其父元素下聚集在一起。

这是生成所需 XML 的查询。 查询使用 ID and IDREFS 指令覆盖列名 (SalesOrder!2!SalesOrderID!IDCustomer!1!SalesOrderIDList!IDREFS) 中的类型。

USE AdventureWorks2012;  
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.CustomerIDORDER BY [Customer!1!CustomerID] ,  
         [SalesOrder!2!SalesOrderID!ID],  
         [Customer!1!SalesOrderIDList!IDREFS]  
FOR XML EXPLICIT;  

另请参阅

将 EXPLICIT 模式与 FOR XML 配合使用