Atomization (XQuery)
適用於:SQL Server
Atomization 是擷取專案具型別值的程式。 在某些情況下會隱含此程式。 某些 XQuery 運算子,例如算術和比較運算子,取決於此程式。 例如,當您將算術運算子直接套用至節點時,會先透過隱含叫用資料函 式來擷取節點的 具型別值。 這會將不可部分完成的值當做運算元傳遞至算術運算子。
例如,下列查詢會傳回 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))')
隱含原子化的另一個範例是當您使用算術運算子時。 運算子 + 需要不可部分完成的值,且 data() 會隱含套用以擷取 LaborHours 屬性的不可部分完成值。 查詢是針對 ProductModel 資料表中 xml 類型的 Instructions 資料行 所指定。 下列查詢會傳回 LaborHours 屬性三次。 在查詢中,請注意下列事項:
在建構 OrignialLaborHours 屬性時,Atomization 會隱含地套用至 所傳回的單一序列。
$WC/@LaborHours
LaborHours 屬性的具型別值會指派給 OrignialLaborHours。在建構 UpdatedLaborHoursV1 屬性時,算術運算子需要不可部分完成的值。 因此, data() 會隱含地套用至 (
$WC/@LaborHours
) 所傳回的 LaborHours 屬性。 接著會將不可部分完成的值 1 加入其中。 屬性 UpdatedLaborHoursV2 的建構會顯示資料的明確應用 , 但並非必要。
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" />
原子化會導致簡單型別、空集或靜態類型錯誤的實例。
Atomization 也會發生在傳遞至函式的比較運算式參數、函式傳回的值、 cast() 運算式,以及依 子句順序傳遞的排序運算式中。