value() Method (xml Data Type)
Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
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.
Sintaksis
value (XQuery, SQLType)
Catatan
Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi 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, gambar, teks, ntext, atau sql_variant yang ditentukan pengguna. SQLType dapat berupa jenis data yang ditentukan pengguna SQL.
Metode value() menggunakan operator Transact-SQL CONVERT secara implisit dan mencoba mengonversi hasil ekspresi XQuery, representasi string serial, dari jenis XSD ke jenis SQL terkait yang ditentukan oleh konversi Transact-SQL. Untuk informasi selengkapnya tentang aturan pengecoran 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
J. 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 XQuery dan Pengetikan Statis.
B. Menggunakan metode value() untuk mengambil nilai dari kolom jenis xml
Kueri berikut ditentukan terhadap kolom tipe 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 dalamvalue()
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 mengembalikan1
(True), metode menunjukkan bahwa instans XML menyertakan elemen turunan <Warranty
> sebagai salah satu fitur.Metode
value()
dalamSELECT
klausulProductModelID
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()
. Misalnya:
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)
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk