アトミック化 (XQuery)
適用対象: SQL Server
アトミック化とは、アイテムの型指定された値を抽出するプロセスです。 このプロセスは、特定の状況下では暗黙的に行われます。 算術演算子や比較演算子などの一部の 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))')
暗黙的なアトミック化のもう 1 つの例は、算術演算子を使用する場合です。 +演算子にはアトミック値が必要であり、laborHours 属性のアトミック値を取得するためにdata()が暗黙的に適用されます。 クエリは、ProductModel テーブルの xml 型の Instructions 列に対して指定されます。 次のクエリでは、LaborHours 属性が 3 回返されます。 クエリで、次の点に注意してください。
OriginalLaborHours 属性を構築する場合、(
$WC/@LaborHours
) によって返されるシングルトン シーケンスにアトミック化が暗黙的に適用されます。 LaborHours 属性の型指定された値は OriginalLaborHours に割り当てられます。UpdatedLaborHoursV1 属性の構築では、算術演算子がアトミック値を必要とします。 したがって、 data() は、(
$WC/@LaborHours
) によって返される 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() 式、および order by 句で渡される順序付け式でも発生します。