適用於:SQL Server
Atomization 是擷取專案具型別值的程式。 在某些情況下會隱含此程式。 某些 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()含地套用至所傳回$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子句傳遞的排序表達式中。