Bagikan melalui


Fungsi Ekstensi XQuery - sql:column()

Berlaku untuk:SQL Server

Seperti yang dijelaskan dalam topik, Mengikat Data Relasional Di dalam XML, Anda dapat menggunakan fungsi sql:column(() saat Anda menggunakan Metode Tipe Data XML untuk mengekspos nilai relasional di dalam XQuery.

Misalnya, metode query() (jenis data XML) digunakan untuk menentukan kueri terhadap instans XML yang disimpan dalam variabel atau kolom jenis xml . Terkadang, Anda mungkin juga ingin kueri Anda menggunakan nilai dari kolom lain, non-XML, untuk menyampulkan data relasional dan XML. Untuk melakukan ini, Anda menggunakan fungsi sql:column().

Nilai SQL akan dipetakan ke nilai XQuery yang sesuai dan jenisnya akan menjadi jenis dasar XQuery yang setara dengan jenis SQL yang sesuai.

Sintaks

  
sql:column("columnName")  

Keterangan

Perhatikan bahwa referensi ke kolom yang ditentukan dalam fungsi sql:column() di dalam XQuery mengacu pada kolom dalam baris yang sedang diproses.

Di SQL Server, Anda hanya dapat merujuk ke instans xml dalam konteks ekspresi sumber pernyataan penyisipan XML-DML; jika tidak, Anda tidak dapat merujuk ke kolom yang berjenis xml atau jenis yang ditentukan pengguna CLR.

Fungsi sql:column() tidak didukung dalam operasi JOIN. Operasi APPLY dapat digunakan sebagai gantinya.

Contoh

J. Menggunakan sql:column() untuk mengambil nilai relasional di dalam XML

Dalam membuat XML, contoh berikut mengilustrasikan bagaimana Anda dapat mengambil nilai dari kolom relasional non-XML ke XML yang mengikat dan data relasional.

Kueri membuat XML yang memiliki formulir berikut:

<Product ProductID="771" ProductName="Mountain-100 Silver, 38" ProductPrice="3399.99" ProductModelID="19"   
  ProductModelName="Mountain 100" />  

Perhatikan hal berikut dalam XML yang dibangun:

  • Nilai atribut ProductID, ProductName, dan ProductPrice diperoleh dari tabel Produk .

  • Nilai atribut ProductModelID diambil dari tabel ProductModel .

  • Untuk membuat kueri lebih menarik, nilai atribut ProductModelName diperoleh dari kolom CatalogDescription jenis xml. Karena informasi katalog model produk XML tidak disimpan untuk semua model produk, if pernyataan digunakan untuk mengambil nilai hanya jika ada.

    SELECT P.ProductID, CatalogDescription.query('  
    declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
           <Product   
               ProductID=       "{ sql:column("P.ProductID") }"  
               ProductName=     "{ sql:column("P.Name") }"  
               ProductPrice=    "{ sql:column("P.ListPrice") }"  
               ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
               { if (not(empty(/pd:ProductDescription))) then  
                 attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
                else   
                   ()  
    }  
            </Product>  
    ') as Result  
    FROM Production.ProductModel PM, Production.Product P  
    WHERE PM.ProductModelID = P.ProductModelID  
    AND   CatalogDescription is not NULL  
    ORDER By PM.ProductModelID  
    

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Karena nilai diambil dari dua tabel yang berbeda, klausa FROM menentukan dua tabel. Kondisi dalam klausa WHERE memfilter hasil dan hanya mengambil produk yang model produknya memiliki deskripsi katalog.

  • Kata kunci namespace di XQuery Prolog menentukan awalan namespace XML, "pd", yang digunakan dalam isi kueri. Perhatikan bahwa alias tabel, "P" dan "PM", didefinisikan dalam klausa FROM kueri itu sendiri.

  • Fungsi sql:column() digunakan untuk membawa nilai non-XML di dalam XML.

Ini adalah hasil parsial:

ProductID               Result  
-----------------------------------------------------------------  
771         <Product ProductID="771"                   ProductName="Mountain-100 Silver, 38"   
                  ProductPrice="3399.99" ProductModelID="19"   
                  ProductModelName="Mountain 100" />  
...  

Kueri berikut membuat XML yang berisi informasi khusus produk. Informasi ini mencakup ProductID, ProductName, ProductPrice, dan, jika tersedia, ProductModelName untuk semua produk yang termasuk dalam model produk tertentu, ProductModelID=19. XML kemudian ditetapkan ke @x variabel jenis xml .

declare @x xml  
SELECT @x = CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
       <Product   
           ProductID=       "{ sql:column("P.ProductID") }"  
           ProductName=     "{ sql:column("P.Name") }"  
           ProductPrice=    "{ sql:column("P.ListPrice") }"  
           ProductModelID= "{ sql:column("PM.ProductModelID") }" >  
           { if (not(empty(/pd:ProductDescription))) then  
             attribute ProductModelName { /pd:ProductDescription[1]/@ProductModelName }  
            else   
               ()  
}  
        </Product>  
')   
FROM Production.ProductModel PM, Production.Product P  
WHERE PM.ProductModelID = P.ProductModelID  
And P.ProductModelID = 19  
select @x  

Lihat Juga

Fungsi Ekstensi XQuery SQL Server
Membandingkan XML Yang Dititik dengan XML Yang Tidak Dititik
XML Data (SQL Server)
Membuat Instans Data XML
Metode Tipe Data xml
Bahasa Modifikasi Data XML (XML DML)