自動化 (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))')

另一個隱含自動化的範例是當您使用算術運算子時。+ 運算子需要不可部份完成值,而且會隱含地套用 data(),以擷取 LaborHours 屬性的不可部份完成值。此查詢是針對 ProductModel 資料表的 Instructions 資料行 (具類型的 xml 資料行) 所指定。下列查詢會傳回 LaborHours 屬性三次。在查詢中,請注意下列項目:

  • 在建構 OrignialLaborHours 屬性時,自動化會隱含套用至 ($WC/@LaborHours) 所傳回的單一序列。LaborHours 屬性具類型的值會指派給 OrignialLaborHours。

  • 在建構 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() 運算式傳回值,以及依子句順序傳遞排序的運算式。