Aracılığıyla paylaş


Atomizasyon (XQuery)

Şunlar için geçerlidir: SQL Server

Atomizasyon, bir öğenin türlenmiş değerini ayıklama işlemidir. Bu işlem belirli koşullar altında ima edilir. Aritmetik ve karşılaştırma işleçleri gibi bazı XQuery işleçleri bu işleme bağlıdır. Örneğin, doğrudan düğümlere aritmetik işleçler uyguladığınızda, bir düğümün yazılan değeri ilk olarak veri işlevi örtük olarak çağrılarak alınır. Bu, atomik değeri aritmetik işlecine işlenen olarak geçirir.

Örneğin, aşağıdaki sorgu özniteliklerin toplamını LaborHours döndürür. Bu durumda, data() öznitelik düğümlerine örtük olarak uygulanır.

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)');

Gerekli olmasa da, işlevi açıkça belirtebilirsiniz data() :

SELECT @x.query('sum(data(ROOT/Location/@LaborHours))');

Örtük atomizasyona bir diğer örnek de aritmetik işleçler kullanmanızdır. + işleci atomik değerler gerektirir ve data() özniteliğin atomik değerini LaborHours almak için örtük olarak uygulanır. Sorgu, ProductModel tablosundaki xml türünün Instructions sütununda belirtilir. Aşağıdaki sorgu özniteliğini LaborHours üç kez döndürür. Sorguda şunları göz önünde bulundurun:

  • özniteliğini OriginalLaborHours oluştururken, atomizasyon tarafından $WC/@LaborHoursdöndürülen tekil diziye örtük olarak uygulanır. özniteliğinin LaborHours yazılan değeri öğesine OriginalLaborHoursatanır.

  • özniteliğini UpdatedLaborHoursV1 oluştururken aritmetik işleci atomik değerler gerektirir. Bu nedenle, data() tarafından $WC/@LaborHoursdöndürülen özniteliğine LaborHours örtük olarak uygulanır. Ardından 1 atomik değeri eklenir. özniteliğinin UpdatedLaborHoursV2 oluşturulması açık uygulamasını data()gösterir, ancak gerekli değildir.

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;

Sonuç şu şekildedir:

<WC OriginalLaborHours="2.5"
    UpdatedLaborHoursV1="3.5"
    UpdatedLaborHoursV2="3.5" />

Atomizasyon basit bir tür, boş bir küme veya statik tür hatasıyla sonuçlanır.

Atomizasyon, işlevlere geçirilen karşılaştırma ifadesi parametrelerinde, işlevler tarafından döndürülen değerlerde, cast() ifadelerde ve order by yan tümcesinde geçirilen sıralama ifadelerinde de gerçekleşir.