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)