アトミック化 (XQuery)
アトミック化とは、アイテムの型指定された値を抽出するプロセスです。このプロセスは、特定の環境では暗黙的に実行されます。算術演算子や比較演算子などの一部の XQuery 演算子は、このプロセスに依存します。たとえば、算術演算子をノードに直接適用すると、data 関数を暗黙的に呼び出すことにより、ノードの型指定された値が最初に取得されます。これにより、アトミック値がオペランドとして算術演算子に渡されます。
たとえば、次のクエリは LaborHours 属性の合計を返します。この場合、data() が属性ノードに暗黙的に適用されます。
declare @x 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))')
暗黙のアトミック化の別の例として、算術演算子を使用するケースがあります。+ 演算子はアトミック値を必要とするので、LaborHours 属性のアトミック値を取得するために data() が暗黙的に適用されます。ProductModel テーブルの xml 型の Instructions 列に対して、クエリが指定されます。次のクエリでは、LaborHours 属性を 3 回返します。このクエリでは、次の点に注意してください。
- OrignialLaborHours 属性の構築では、(
$WC/@LaborHours
) によって返される単一シーケンスにアトミック化が暗黙的に適用されます。LaborHours 属性の型指定された値が、OrignialLaborHours に代入されます。 - UpdatedLaborHoursV1 属性の構築では、算術演算子がアトミック値を必要とします。そのため、(
$WC/@LaborHours
) によって返される LaborHours 属性に、data() が暗黙的に適用されます。次に、アトミック値 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() 式、および Order By 句に渡される順序式でも発生します。