元素属性可以指定为 ID 类型属性,然后可以使用该 IDREFS 属性来引用它。 这将启用文档内链接,类似于关系数据库中的主键和外键关系。
此示例演示了如何使用 ID 和 IDREFS 指令创建属性 ID 和 IDREFS 类型。 由于 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!ID, Customer!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;