Bagikan melalui


Konteks Ekspresi dan Evaluasi Kueri (XQuery)

Berlaku untuk: SQL Server

Konteks ekspresi adalah informasi yang digunakan untuk menganalisis dan mengevaluasinya. Berikut adalah dua fase di mana XQuery dievaluasi:

  • Konteks statis - Ini adalah fase kompilasi kueri. Berdasarkan informasi yang tersedia, kesalahan terkadang dimunculkan selama analisis statis kueri ini.

  • Konteks dinamis - Ini adalah fase eksekusi kueri. Bahkan jika kueri tidak memiliki kesalahan statis, seperti kesalahan selama kompilasi kueri, kueri dapat mengembalikan kesalahan selama eksekusinya.

Konteks Statis

Inisialisasi konteks statis mengacu pada proses menyusun semua informasi untuk analisis statis ekspresi. Sebagai bagian dari inisialisasi konteks statis, berikut ini selesai:

  • Kebijakan spasi kosong batas diatur ke strip. Oleh karena itu, ruang putih batas tidak dipertahankan oleh elemen dan konstruktor atribut apa pun dalam kueri. Contohnya:

    declare @x xml  
    set @x=''  
    select @x.query('<a>  {"Hello"}  </a>,  
    
        <b> {"Hello2"}  </b>')  
    

    Kueri ini mengembalikan hasil berikut, karena ruang batas dilucuti selama penguraian ekspresi XQuery:

    <a>Hello</a><b>Hello2</b>  
    
  • Awalan dan pengikatan namespace diinisialisasi untuk yang berikut ini:

    • Sekumpulan namespace yang telah ditentukan sebelumnya.

    • Namespace apa pun yang ditentukan menggunakan WITH XMLNAMESPACES. Untuk informasi selengkapnya, lihat Menambahkan Namespace ke Kueri dengan XMLNAMESPACES).

    • Namespace apa pun yang ditentukan dalam prolog kueri. Perhatikan bahwa deklarasi namespace dalam prolog dapat menimpa deklarasi namespace di WITH XMLNAMESPACES. Misalnya, dalam kueri berikut, WITH XMLNAMESPACES mendeklarasikan awalan (pd) yang mengikatnya ke namespace (https://someURI). Namun, dalam klausa WHERE, prolog kueri mengambil alih pengikatan.

      WITH XMLNAMESPACES ('https://someURI' AS pd)  
      SELECT ProductModelID, CatalogDescription.query('  
          <Product   
              ProductModelID= "{ sql:column("ProductModelID") }"   
              />  
      ') AS Result  
      FROM Production.ProductModel  
      WHERE CatalogDescription.exist('  
          declare namespace  pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
           /pd:ProductDescription[(pd:Specifications)]'  
          ) = 1  
      

    Semua pengikatan namespace ini diselesaikan selama inisialisasi konteks statis.

  • Jika mengkueri kolom atau variabel xml yang diketik, komponen koleksi skema XML yang terkait dengan kolom atau variabel diimpor ke dalam konteks statis. Untuk informasi selengkapnya, lihat Membandingkan XML Yang Ditik dengan XML Yang Tidak Ditiru.

  • Untuk setiap jenis atom dalam skema yang diimpor, fungsi transmisi juga tersedia dalam konteks statis. Ini diilustrasikan dalam contoh berikut. Dalam contoh ini, kueri ditentukan terhadap variabel xml yang ditik. Koleksi skema XML yang terkait dengan variabel ini mendefinisikan jenis atom, myType. Sesuai dengan jenis ini, fungsi casting, myType(), tersedia selama analisis statis. Ekspresi kueri (ns:myType(0)) mengembalikan nilai myType.

    -- DROP XML SCHEMA COLLECTION SC  
    -- go  
    CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema"   
    targetNamespace="myNS" xmlns:ns="myNS"  
    xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">  
          <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>  
          <simpleType name="myType">  
                <restriction base="int">  
                 <enumeration value="0" />  
                  <enumeration value="1"/>  
                </restriction>  
          </simpleType>  
          <element name="root" type="ns:myType"/>  
    </schema>'  
    go  
    
    DECLARE @var XML(SC)  
    SET @var = '<root xmlns="myNS">0</root>'  
    -- specify myType() casting function in the query  
    SELECT @var.query('declare namespace ns="myNS"; ns:myType(0)')  
    

    Dalam contoh berikut, fungsi transmisi untuk jenis XML bawaan int ditentukan dalam ekspresi.

    declare @x xml  
    set @x = ''  
    select @x.query('xs:int(5)')  
    go  
    

Setelah konteks statis diinisialisasi, ekspresi kueri dianalisis (dikompilasi). Analisis statis melibatkan hal-hal berikut:

  1. Penguraian kueri.

  2. Mengatasi nama fungsi dan jenis yang ditentukan dalam ekspresi.

  3. Pengetikan statis kueri. Ini memastikan bahwa kueri berjenis aman. Misalnya, kueri berikut mengembalikan kesalahan statis, karena + operator memerlukan argumen jenis primitif numerik:

    declare @x xml  
    set @x=''  
    SELECT @x.query('"x" + 4')  
    

    Dalam contoh berikut, operator value() memerlukan singleton. Seperti yang ditentukan dalam skema XML, mungkin ada beberapa <elemen Elem> . Analisis statis ekspresi menentukan bahwa ekspresi tersebut tidak aman jenisnya dan kesalahan statis dikembalikan. Untuk mengatasi kesalahan, ekspresi harus ditulis ulang untuk secara eksplisit menentukan singleton (data(/x:Elem)[1]).

    DROP XML SCHEMA COLLECTION SC  
    go  
    CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema"   
    targetNamespace="myNS" xmlns:ns="myNS"  
    xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">  
          <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>  
          <element name="Elem" type="string"/>  
    </schema>'  
    go  
    
    declare @x xml (SC)  
    set @x='<Elem xmlns="myNS">test</Elem><Elem xmlns="myNS">test2</Elem>'  
    SELECT @x.value('declare namespace x="myNS"; data(/x:Elem)[1]','varchar(20)')  
    

    Untuk informasi selengkapnya, lihat XQuery dan Pengetikan Statis.

Pembatasan Implementasi

Berikut ini adalah batasan yang terkait dengan konteks statis:

  • Mode kompatibilitas XPath tidak didukung.

  • Untuk konstruksi XML, hanya mode konstruksi strip yang didukung. Ini adalah pengaturan default. Oleh karena itu, jenis node elemen yang dibangun adalah dari jenis xdt:untyped dan atributnya berjenis xdt:untypedAtomic .

  • Hanya mode pemesanan yang didukung.

  • Hanya kebijakan ruang XML strip yang didukung.

  • Fungsionalitas URI dasar tidak didukung.

  • fn:doc() tidak didukung.

  • fn:collection() tidak didukung.

  • Penbendera statis XQuery tidak disediakan.

  • Kolase yang terkait dengan jenis data xml digunakan. Kolase ini selalu diatur ke kolase codepoint Unicode.

Konteks Dinamis

Konteks dinamis mengacu pada informasi yang harus tersedia pada saat ekspresi dijalankan. Selain konteks statis, informasi berikut diinisialisasi sebagai bagian dari konteks dinamis:

  • Fokus ekspresi, seperti item konteks, posisi konteks, dan ukuran konteks, diinisialisasi seperti yang ditunjukkan dalam hal berikut. Perhatikan bahwa semua nilai ini dapat ditimpa oleh metode node().

    • Jenis data xml mengatur item konteks, simpul yang sedang diproses, ke simpul dokumen.

    • Posisi konteks, posisi item konteks relatif terhadap simpul yang sedang diproses, pertama-tama diatur ke 1.

    • Ukuran konteks, jumlah item dalam urutan yang sedang diproses, pertama-tama diatur ke 1, karena selalu ada satu simpul dokumen.

Pembatasan Implementasi

Berikut ini adalah batasan yang terkait dengan konteks dinamis:

  • Fungsi konteks tanggal dan waktu saat ini, fn:current-date, fn:current-time, dan fn:current-dateTime, tidak didukung.

  • Zona waktu implisit diperbaiki ke UTC+0 dan tidak dapat diubah.

  • Fungsi fn:doc() tidak didukung. Semua kueri dijalankan terhadap kolom atau variabel jenis xml .

  • Fungsi fn:collection() tidak didukung.

Lihat Juga

Dasar-Dasar XQuery
Membandingkan XML Yang Dititik dengan XML Yang Tidak Dititik
Koleksi Skema XML (SQL Server)