metode value() (jenis data xml)
Berlaku untuk: SQL ServerAzure SQL Database Azure 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 SELECT
kueri yang menggabungkan atau membandingkan data XML dengan data di kolom non-XML.
Sintaks
value ( XQuery , SQLType )
Argumen
XQuery
Ekspresi XQuery , string literal, yang mengambil data di dalam instans XML. XQuery harus mengembalikan paling banyak satu nilai. Jika tidak, kesalahan dikembalikan.
SQLType
Jenis SQL pilihan, string literal, yang akan dikembalikan. Jenis pengembalian metode ini cocok dengan parameter SQLType . SQLType dapat menjadi jenis data SQL yang ditentukan pengguna.
Catatan
SQLType tidak boleh menjadi salah satu jenis data berikut: jenis xml, gambar, teks, ntext, sql_variant, atau runtime bahasa umum (CLR).
Metode ini value()
menggunakan operator Transact-SQL CONVERT
secara implisit. value()
mencoba mengonversi hasil ekspresi XQuery, representasi string berseri, dari jenis Definisi Skema XML (XSD) ke jenis SQL terkait yang ditentukan oleh konversi Transact-SQL. Untuk informasi selengkapnya tentang jenis aturan transmisi untuk CONVERT
, lihat CAST dan CONVERT.
Untuk alasan performa, Anda dapat menggunakan exist()
dengan sql:column()
alih-alih menggunakan value()
metode dalam predikat, untuk membandingkan dengan nilai relasional. Contoh ini exist()
ditampilkan nanti di artikel ini.
Contoh
Sampel kode Transact-SQL dalam artikel ini menggunakan AdventureWorks2022
database sampel atau AdventureWorksDW2022
, yang dapat Anda unduh dari halaman beranda Sampel Microsoft SQL Server dan Proyek Komunitas.
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 variabel int .
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, [1]
ditambahkan ke akhir ekspresi jalur. Untuk informasi selengkapnya tentang pengetikan statis, lihat XQuery dan Pengetikan Statis.
B. Gunakan metode value() untuk mengambil nilai bilangan bulat dari kolom jenis XML
Kueri berikut ditentukan terhadap kolom tipe xml (CatalogDescription
) dalam AdventureWorks2022
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;
Catatan 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.
Berikut set hasilnya.
35
34
28
25
23
19
C. Gunakan metode value() untuk mengambil nilai string dari kolom jenis XML
Kueri berikut ditentukan terhadap kolom tipe xml (CatalogDescription
) dalam AdventureWorks2022
database. Kueri mengambil nilai atribut dari setiap instans ProductModelName
XML yang disimpan di kolom .
SELECT CatalogDescription.value(
'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
(/PD:ProductDescription/@ProductModelName)[1]', 'varchar(50)') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL
ORDER BY Result DESC;
Catatan 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.
Berikut set hasilnya.
Touring-2000
Touring-1000
Road-450
Road-150
Mountain-500
Mountain 100
D. Gunakan 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;
Catatan dari kueri sebelumnya:
Kolom
CatalogDescription
adalah kolom XML yang ditik. Ini berarti bahwa ia memiliki koleksi skema yang terkait dengannya. Dalam Modul dan Prolog - XQuery Prolog, deklarasi namespace digunakan untuk menentukan awalan yang digunakan nanti di isi kueri.exist()
Jika metode mengembalikan1
(true), itu menunjukkan bahwa instans XML menyertakan elemen turunan<Warranty>
sebagai salah satu fitur.Metode
value()
dalamSELECT
klausulProductModelID
kemudian mengambil nilai atribut sebagai bilangan bulat.
Berikut hasil parsialnya:
19
23
...
E. Gunakan 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)[1]', 'integer') = c1;
GO
Kode ini dapat ditulis ulang sebagai berikut:
SELECT c1, c2, c3
FROM T
WHERE c3.exist('/root[@a=sql:column("c1")]') = 1;
GO