Bagikan melalui


Sistem Jenis (XQuery)

Berlaku untuk:SQL Server

XQuery adalah bahasa yang sangat diketik untuk jenis skema dan bahasa yang diketik lemah untuk data yang tidak diketik. Jenis XQuery yang telah ditentukan sebelumnya meliputi yang berikut ini:

Topik ini juga menjelaskan hal-hal berikut:

Jenis Skema XML Bawaan

Jenis skema XML bawaan memiliki awalan namespace layanan x yang telah ditentukan sebelumnya. Beberapa jenis ini termasuk xs:integer dan xs:string. Semua jenis bawaan ini didukung. Anda dapat menggunakan jenis ini saat membuat koleksi skema XML.

Saat mengkueri XML yang diketik, tipe statis dan dinamis simpul ditentukan oleh koleksi skema XML yang terkait dengan kolom atau variabel yang sedang dikueri. Untuk informasi selengkapnya tentang jenis statis dan dinamis, lihat Konteks Ekspresi dan Evaluasi Kueri (XQuery). Misalnya, kueri berikut ditentukan terhadap kolom xml yang ditik (Instructions). Ekspresi menggunakan instance of untuk memverifikasi bahwa nilai tipe atribut yang LotSize dikembalikan berjenis xs:decimal .

SELECT Instructions.query('  
   DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
   data(/AWMI:root[1]/AWMI:Location[@LocationID=10][1]/@LotSize)[1] instance of xs:decimal  
') AS Result  
FROM Production.ProductModel  
WHERE ProductModelID=7  

Informasi pengetikan ini disediakan oleh koleksi skema XML yang terkait dengan kolom .

Jenis yang Ditentukan dalam Namespace Tipe Data XPath

Jenis yang http://www.w3.org/2004/07/xpath-datatypes ditentukan dalam namespace memiliki awalan xdt yang telah ditentukan sebelumnya. Berikut ini berlaku untuk jenis ini:

  • Anda tidak dapat menggunakan tipe ini saat membuat kumpulan skema XML. Jenis ini digunakan dalam sistem jenis XQuery dan digunakan untuk XQuery dan Pengetikan Statis. Anda dapat mentransmisikan ke jenis atomik, misalnya, xdt:untypedAtomic, di namespace xdt .

  • Saat mengkueri XML yang tidak dijenis, jenis node elemen statis dan dinamis adalah xdt:untyped, dan jenis nilai atribut adalah xdt:untypedAtomic. Hasil metode query() menghasilkan XML yang tidak dititik. Ini berarti bahwa simpul XML dikembalikan sebagai xdt:untyped dan xdt:untypedAtomic, masing-masing.

  • Jenis xdt:dayTimeDuration dan xdt:yearMonthDuration tidak didukung.

Dalam contoh berikut, kueri ditentukan terhadap variabel XML yang tidak dititip. Ekspresi, data(/a[1]), mengembalikan urutan dari satu nilai atomik. Fungsi data() mengembalikan nilai yang ditik dari elemen <a>. Karena XML yang sedang dikueri tidak dijelajahi, jenis nilai yang dikembalikan adalah xdt:untypedAtomic. Oleh karena itu, instance of mengembalikan true.

DECLARE @x xml  
SET @x='<a>20</a>'  
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )  

Alih-alih mengambil nilai yang ditik, ekspresi (/a[1]) dalam contoh berikut mengembalikan urutan satu elemen, elemen <a>. Ekspresi instance of menggunakan pengujian elemen untuk memverifikasi bahwa nilai yang dikembalikan oleh ekspresi adalah node elemen dari xdt:untyped type.

DECLARE @x xml  
SET @x='<a>20</a>'  
-- Is this an element node whose name is "a" and type is xdt:untyped.  
SELECT @x.query( '/a[1] instance of element(a, xdt:untyped?)')  
-- Is this an element node of type xdt:untyped.  
SELECT @x.query( '/a[1] instance of element(*, xdt:untyped?)')  
-- Is this an element node?  
SELECT @x.query( '/a[1] instance of element()')  

Catatan

Saat Anda mengkueri instans XML yang di ketik dan ekspresi kueri menyertakan sumbu induk, informasi jenis statis dari simpul yang dihasilkan tidak lagi tersedia. Namun, jenis dinamis masih dikaitkan dengan simpul.

Nilai yang Ditik vs. Nilai String

Setiap simpul memiliki nilai yang ditik dan nilai string. Untuk data XML yang diketik, jenis nilai yang diketik disediakan oleh koleksi skema XML yang terkait dengan kolom atau variabel yang sedang dikueri. Untuk data XML yang tidak dititip, jenis nilai yang di ketik adalah xdt:untypedAtomic.

Anda dapat menggunakan fungsi data() atau string() untuk mengambil nilai simpul:

Dalam kumpulan skema XML berikut, <root> elemen jenis bilangan bulat ditentukan:

CREATE XML SCHEMA COLLECTION SC AS N'  
<schema xmlns="http://www.w3.org/2001/XMLSchema">  
      <element name="root" type="integer"/>  
</schema>'  
GO  

Dalam contoh berikut, ekspresi terlebih dahulu mengambil nilai yang ditik /root[1] lalu menambahkannya 3 .

DECLARE @x xml(SC)  
SET @x='<root>5</root>'  
SELECT @x.query('data(/root[1]) + 3')  

Dalam contoh berikutnya, ekspresi gagal, karena string(/root[1]) dalam ekspresi mengembalikan nilai jenis string. Nilai ini kemudian diteruskan ke operator aritmatika yang hanya mengambil nilai jenis numerik sebagai operannya.

-- Fails because the argument is string type (must be numeric primitive type).  
DECLARE @x xml(SC)  
SET @x='<root>5</root>'  
SELECT @x.query('string(/root[1]) + 3')  

Contoh berikut menghitung total LaborHours atribut. Fungsi ini data() mengambil nilai atribut yang ditik LaborHours dari semua <Location> elemen untuk model produk. Menurut skema XML yang terkait dengan Instruction kolom , LaborHours adalah jenis xs:desimal .

SELECT Instructions.query('   
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";   
             sum(data(//AWMI:Location/@LaborHours))   
') AS Result   
FROM Production.ProductModel   
WHERE ProductModelID=7  

Kueri ini mengembalikan 12,75 sebagai hasilnya.

Catatan

Penggunaan eksplisit fungsi data() dalam contoh ini hanya untuk ilustrasi. Jika tidak ditentukan, sum() secara implisit menerapkan fungsi data() untuk mengekstrak nilai node yang diekstrak.

Lihat Juga

Templat dan Izin Profiler SQL Server
Dasar-Dasar XQuery