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:
Jenis skema XML bawaan di http://www.w3.org/2001/XMLSchema namespace layanan.
Jenis yang ditentukan dalam http://www.w3.org/2004/07/xpath-datatypes namespace layanan.
Topik ini juga menjelaskan hal-hal berikut:
Nilai yang ditik versus nilai string simpul.
Mencocokkan jenis urutan yang dikembalikan oleh ekspresi.
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:
Fungsi data (XQuery) mengembalikan nilai node yang ditik.
Fungsi string (XQuery) mengembalikan nilai string 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.