metode value() (tipe data xml)

Berlaku untuk: SQL Server (semua versi yang didukung) Azure SQL Managed Instance Database Azure SQL

Melakukan XQuery terhadap XML dan mengembalikan nilai jenis SQL. Metode ini mengembalikan nilai skalar.

Anda biasanya menggunakan metode ini untuk mengekstrak nilai dari instans XML yang disimpan dalam kolom jenis xml , parameter, atau variabel. Dengan cara ini, Anda dapat menentukan kueri SELECT yang menggabungkan atau membandingkan data XML dengan data di kolom non-XML.

Sintaks

value (XQuery, SQLType)  

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 dan yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

XQuery
Adalah ekspresi XQuery , string harfiah, yang mengambil data di dalam instans XML. XQuery harus mengembalikan paling banyak satu nilai. Jika tidak, kesalahan dikembalikan.

SQLType
Adalah jenis SQL pilihan, string harfiah, yang akan dikembalikan. Jenis pengembalian metode ini cocok dengan parameter SQLType . SQLType tidak boleh berupa tipe data xml , jenis data yang ditentukan pengguna runtime bahasa umum (CLR), gambar, teks, ntext, atau jenis data sql_variant . SQLType dapat berupa SQL, jenis data yang ditentukan pengguna.

Metode value() menggunakan operator Transact-SQL CONVERT secara implisit dan mencoba mengonversi hasil ekspresi XQuery, representasi string yang diserialisasikan, dari jenis XSD ke jenis SQL terkait yang ditentukan oleh konversi Transact-SQL. Untuk informasi selengkapnya tentang aturan transmisi jenis untuk CONVERT, lihat CAST dan CONVERT (Transact-SQL).

Catatan

Untuk alasan performa, alih-alih menggunakan metode value() dalam predikat untuk membandingkan dengan nilai relasional, gunakan exist() dengan sql:column(). Ini ditunjukkan dalam contoh D yang mengikuti.

Contoh

A. Menggunakan metode value() terhadap variabel jenis xml

Dalam contoh berikut, instans XML disimpan dalam variabel jenis xml . Metode mengambil value()ProductID nilai atribut dari XML. Nilai kemudian ditetapkan ke int variabel.

DECLARE @myDoc XML  
DECLARE @ProdID INT  
SET @myDoc = '<Root>  
<ProductDescription ProductID="1" ProductName="Road Bike">  
<Features>  
  <Warranty>1 year parts and labor</Warranty>  
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>  
</Features>  
</ProductDescription>  
</Root>'  
  
SET @ProdID =  @myDoc.value('(/Root/ProductDescription/@ProductID)[1]', 'int' )  
SELECT @ProdID  

Nilai 1 dikembalikan sebagai hasilnya.

Meskipun hanya ada satu ProductID atribut dalam instans XML, aturan pengetikan statis mengharuskan Anda untuk secara eksplisit menentukan bahwa ekspresi jalur mengembalikan singleton. Oleh karena itu, tambahan [1] ditentukan di akhir ekspresi jalur. Untuk informasi selengkapnya tentang pengetikan statis, lihat Pengetikan XQuery dan Statis.

B. Menggunakan metode value() untuk mengambil nilai dari kolom jenis xml

Kueri berikut ditentukan terhadap kolom jenis xml (CatalogDescription) dalam AdventureWorks database. Kueri mengambil nilai atribut dari setiap instans ProductModelID XML yang disimpan di kolom .

SELECT CatalogDescription.value('             
    declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";             
       (/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result             
FROM Production.ProductModel             
WHERE CatalogDescription IS NOT NULL             
ORDER BY Result DESC             

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Kata namespace kunci digunakan untuk menentukan awalan namespace.

  • Per persyaratan pengetikan statis, [1] ditambahkan di akhir ekspresi jalur dalam value() metode untuk secara eksplisit menunjukkan bahwa ekspresi jalur mengembalikan singleton.

Ini adalah hasil parsial:

-----------  
35           
34           
...  

C. Menggunakan metode value() dan exist() untuk mengambil nilai dari kolom jenis xml

Contoh berikut menunjukkan penggunaan value() metode dan metode exist() dari jenis data xml . Metode value() ini digunakan untuk mengambil ProductModelID nilai atribut dari XML. Metode exist() dalam WHERE klausa digunakan untuk memfilter baris dari tabel.

Kueri mengambil ID model produk dari instans XML yang menyertakan informasi garansi ( <Warranty> elemen) sebagai salah satu fitur. Kondisi dalam WHERE klausul exist() menggunakan metode untuk hanya mengambil baris yang memenuhi kondisi ini.

SELECT CatalogDescription.value('  
     declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
           (/PD:ProductDescription/@ProductModelID)[1] ', 'int') AS Result  
FROM  Production.ProductModel  
WHERE CatalogDescription.exist('  
     declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
  
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1  

Perhatikan hal berikut ini dari kueri sebelumnya:

  • Kolom CatalogDescription adalah kolom XML yang ditik. Ini berarti bahwa ia memiliki koleksi skema yang terkait dengannya. Di XQuery Prolog, deklarasi namespace digunakan untuk menentukan awalan yang digunakan nanti dalam isi kueri.

  • exist() Jika metode mengembalikan 1 (True), itu menunjukkan bahwa instans XML menyertakan <Warranty> elemen anak sebagai salah satu fitur.

  • Metode value() dalam SELECT klausul ProductModelID kemudian mengambil nilai atribut sebagai bilangan bulat.

Ini adalah hasil parsial:

Result       
-----------  
19           
23           
...  

D. Menggunakan metode exist() alih-alih metode value()

Untuk alasan performa, alih-alih menggunakan value() metode dalam predikat untuk membandingkan dengan nilai relasional, gunakan exist() dengan sql:column(). Contohnya:

CREATE TABLE T (c1 INT, c2 VARCHAR(10), c3 XML)  
GO  
  
SELECT c1, c2, c3   
FROM T  
WHERE c3.value( '(/root[@a=sql:column("c1")]/@a)[1]', 'integer') = c1  
GO  

Ini dapat ditulis dengan cara berikut:

SELECT c1, c2, c3   
FROM T  
WHERE c3.exist( '/root[@a=sql:column("c1")]') = 1  
GO  

Lihat juga

Menambahkan Namespace ke Kueri dengan XMLNAMESPACES
Membandingkan XML Yang Dititik dengan XML Yang Tidak Dititik
Membuat Instans Data XML
Metode Tipe Data xml
Bahasa Modifikasi Data XML (XML DML)