Bagikan melalui


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 dalam value() 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 dalam value() 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 mengembalikan 1 (true), itu menunjukkan bahwa instans XML menyertakan elemen turunan <Warranty> sebagai salah satu fitur.

  • Metode value() dalam SELECT klausul ProductModelID 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