Bagikan melalui


Atomisasi (XQuery)

Berlaku untuk:SQL Server

Atomisasi adalah proses mengekstrak nilai item yang diekstrak. Proses ini tersirat dalam keadaan tertentu. Beberapa operator XQuery, seperti operator aritmatika dan perbandingan, bergantung pada proses ini. Misalnya, ketika Anda menerapkan operator aritmetika langsung ke simpul, nilai node yang diketik pertama kali diambil dengan secara implisit memanggil fungsi data. Ini meneruskan nilai atom sebagai operand ke operator aritmatika.

Misalnya, kueri berikut mengembalikan total LaborHours atribut. Dalam hal ini, data() secara implisit diterapkan ke simpul atribut.

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

Meskipun tidak diperlukan, Anda juga dapat secara eksplisit menentukan data() fungsi:

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

Contoh lain dari atomisasi implisit adalah ketika Anda menggunakan operator aritmatika. Operator + memerlukan nilai atomik, dan data() secara implisit diterapkan untuk mengambil nilai LaborHours atom atribut. Kueri ditentukan terhadap kolom Instruksi jenis xml dalam tabel ProductModel. Kueri berikut mengembalikan LaborHours atribut tiga kali. Dalam kueri, pertimbangkan:

  • Dalam membangun OriginalLaborHours atribut, atomisasi secara implisit diterapkan ke urutan singleton yang dikembalikan oleh $WC/@LaborHours. Nilai atribut yang LaborHours ditik ditetapkan ke OriginalLaborHours.

  • Dalam membuat UpdatedLaborHoursV1 atribut, operator aritmatika memerlukan nilai atom. Oleh karena itu, data() secara implisit diterapkan ke atribut yang LaborHours dikembalikan oleh $WC/@LaborHours. Nilai atom 1 kemudian ditambahkan ke dalamnya. Konstruksi atribut UpdatedLaborHoursV2 menunjukkan aplikasi eksplisit , data()tetapi tidak diperlukan.

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;

Berikut hasilnya:

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

Atomisasi menghasilkan instans jenis sederhana, set kosong, atau kesalahan jenis statis.

Atomisasi juga terjadi dalam parameter ekspresi perbandingan yang diteruskan ke fungsi, nilai yang dikembalikan oleh fungsi, cast() ekspresi, dan ekspresi pengurutan yang diteruskan dalam urutan berdasarkan klausa.