原子化 (XQuery)

适用范围:SQL Server

原子化是提取项的类型化值的过程。 在某些环境下,此进程是隐式进行的。 某些 XQuery 运算符(如算术运算符和比较运算符)依赖于此进程。 例如,将算术运算符直接应用于节点时,首先通过隐式调用 数据函数来检索节点的类型化值。 这将把原子值作为操作数传递给算术运算符。

例如,以下查询返回属性总数 LaborHours 。 在这种情况下, data() 隐式应用于属性节点。

DECLARE @x AS XML;

SET @x = '<ROOT><Location LID="1" SetupTime="1.1" LaborHours="3.3" />
<Location LID="2" SetupTime="1.0" LaborHours="5" />
<Location LID="3" SetupTime="2.1" LaborHours="4" />
</ROOT>';
-- data() implicitly applied to the attribute node sequence.

SELECT @x.query('sum(/ROOT/Location/@LaborHours)');

虽然不需要,但也可以显式指定 data() 函数:

SELECT @x.query('sum(data(ROOT/Location/@LaborHours))');

隐式原子化的另一个示例是使用算术运算符。 运算符 + 需要原子值,并 data() 隐式应用以检索特性的 LaborHours 原子值。 针对 ProductModel 表中 xml 类型的 Instructions 列指定查询。 以下查询返回 LaborHours 属性三次。 在查询中,请考虑:

  • 在构造特性时 OriginalLaborHours ,原子化将隐式应用于返回的单 $WC/@LaborHours一实例序列。 属性的类型 LaborHours 化值分配给 OriginalLaborHours

  • 在构造 UpdatedLaborHoursV1 特性时,算术运算符需要原子值。 因此, data() 隐式应用于 LaborHours$WC/@LaborHours该属性返回的属性。 然后,原子值 1 添加到该属性。 属性 UpdatedLaborHoursV2 的构造显示显式应用 data(),但不需要。

SELECT Instructions.query('
     declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $WC in /AWMI:root/AWMI:Location[1]
        return
            <WC OriginalLaborHours = "{ $WC/@LaborHours }"
                UpdatedLaborHoursV1 = "{ $WC/@LaborHours + 1 }"
                UpdatedLaborHoursV2 = "{ data($WC/@LaborHours) + 1 }" >
            </WC>') AS Result
FROM Production.ProductModel
WHERE ProductModelID = 7;

结果如下:

<WC OriginalLaborHours="2.5"
    UpdatedLaborHoursV1="3.5"
    UpdatedLaborHoursV2="3.5" />

原子化将导致简单类型、空集、静态类型的实例错误。

原子化也发生在传递给函数的比较表达式参数、函数返回的值、 cast() 表达式和按子句顺序传递的排序表达式中。