分享方式:


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() 運算式,以及依 子句順序傳遞的排序運算式中。

另請參閱

XQuery 基本概念
比較運算式 (XQuery)
針對 xml 資料類型的 XQuery 函式