Ekspresi SequenceType (XQuery)
Berlaku untuk:SQL Server
Di XQuery, nilai selalu merupakan urutan. Jenis nilai disebut sebagai jenis urutan. Jenis urutan dapat digunakan dalam instans ekspresi XQuery. Sintaks SequenceType yang dijelaskan dalam spesifikasi XQuery digunakan saat Anda perlu merujuk ke jenis dalam ekspresi XQuery.
Nama jenis atom juga dapat digunakan dalam pemeran sebagai ekspresi XQuery. Di SQL Server, instans dan transmisikan sebagai ekspresi XQuery pada SequenceTypes didukung sebagian.
instans Operator
Instans operator dapat digunakan untuk menentukan dinamis, atau run-time, jenis nilai ekspresi yang ditentukan. Contohnya:
Expression instance of SequenceType[Occurrence indicator]
Perhatikan bahwa instance of
operator, Occurrence indicator
, menentukan kardinalitas, jumlah item dalam urutan yang dihasilkan. Jika ini tidak ditentukan, kardinalitas diasumsikan 1. Di SQL Server, hanya indikator kemunculan tanda tanya (?) yang didukung. Indikator kemunculan ? menunjukkan bahwa Expression
dapat mengembalikan nol atau satu item. Jika indikator kemunculan ? ditentukan, instance of
mengembalikan True saat Expression
jenis cocok dengan yang ditentukan SequenceType
, terlepas dari apakah Expression
mengembalikan satuton atau urutan kosong.
Jika indikator kemunculan ? tidak ditentukan, sequence of
mengembalikan True hanya ketika Expression
jenis cocok dengan Type
yang ditentukan dan Expression
mengembalikan singleton.
Catatan Simbol plus (+) dan indikator kemunculan tanda bintang (*) tidak didukung di SQL Server.
Contoh berikut mengilustrasikan penggunaaninstans operator XQuery.
Contoh A
Contoh berikut membuat variabel jenis xml dan menentukan kueri terhadapnya. Ekspresi kueri menentukan instance of
operator untuk menentukan apakah jenis dinamis nilai yang dikembalikan oleh operand pertama cocok dengan jenis yang ditentukan dalam operand kedua.
Kueri berikut mengembalikan True, karena nilai 125 adalah instans dari jenis yang ditentukan, xs:integer:
declare @x xml
set @x=''
select @x.query('125 instance of xs:integer')
go
Kueri berikut mengembalikan True, karena nilai yang dikembalikan oleh ekspresi, /a[1], dalam operand pertama adalah elemen:
declare @x xml
set @x='<a>1</a>'
select @x.query('/a[1] instance of element()')
go
Demikian pula, instance of
mengembalikan True dalam kueri berikut, karena jenis nilai ekspresi dalam ekspresi pertama adalah atribut:
declare @x xml
set @x='<a attr1="x">1</a>'
select @x.query('/a[1]/@attr1 instance of attribute()')
go
Dalam contoh berikut, ekspresi, data(/a[1]
, mengembalikan nilai atomik yang diketik sebagai xdt:untypedAtomic. Oleh karena itu, mengembalikan instance of
True.
declare @x xml
set @x='<a>1</a>'
select @x.query('data(/a[1]) instance of xdt:untypedAtomic')
go
Dalam kueri berikut, ekspresi, data(/a[1]/@attrA
, mengembalikan nilai atom yang tidak diketik. Oleh karena itu, mengembalikan instance of
True.
declare @x xml
set @x='<a attrA="X">1</a>'
select @x.query('data(/a[1]/@attrA) instance of xdt:untypedAtomic')
go
Contoh B
Dalam contoh ini, Anda mengkueri kolom XML yang ditik di database sampel AdventureWorks. Kumpulan skema XML yang terkait dengan kolom yang sedang dikueri menyediakan informasi pengetikan.
Dalam ekspresi, data() mengembalikan nilai yang diketik dari atribut ProductModelID yang jenisnya xs:string sesuai dengan skema yang terkait dengan kolom. Oleh karena itu, mengembalikan instance of
True.
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
data(/PD:ProductDescription[1]/@ProductModelID) instance of xs:string
') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19
Untuk informasi selengkapnya, lihat Membandingkan XML Yang Ditik dengan XML Yang Tidak Ditiru.
Kueri berikut menggunakan ekspresiBoolean instance of
untuk menentukan apakah atribut LocationID berjenis xs:integer:
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/AWMI:root[1]/AWMI:Location[1]/@LocationID instance of attribute(LocationID,xs:integer)
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7
Kueri berikut ditentukan terhadap kolom XML yang di ketik CatalogDescription. Kumpulan skema XML yang terkait dengan kolom ini menyediakan informasi pengetikan.
Kueri menggunakan element(ElementName, ElementType?)
pengujian dalam instance of
ekspresi untuk memverifikasi bahwa /PD:ProductDescription[1]
mengembalikan node elemen dari nama dan jenis tertentu.
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/PD:ProductDescription[1] instance of element(PD:ProductDescription, PD:ProductDescription?)
') as Result
FROM Production.ProductModel
where ProductModelID=19
Kueri mengembalikan True.
Contoh C
Saat menggunakan jenis gabungan, instance of
ekspresi di SQL Server memiliki batasan: Secara khusus, ketika jenis elemen atau atribut adalah jenis gabungan, instance of
mungkin tidak menentukan jenis yang tepat. Akibatnya, kueri akan mengembalikan False, kecuali jenis atom yang digunakan dalam SequenceType adalah induk tertinggi dari jenis ekspresi aktual dalam hierarki simpleType. Artinya, jenis atom yang ditentukan dalam SequenceType harus merupakan anak langsung dari anySimpleType. Untuk informasi tentang hierarki jenis, lihat Jenis Aturan Casting di XQuery.
Contoh kueri berikutnya melakukan hal berikut:
Buat koleksi skema XML dengan jenis gabungan, seperti bilangan bulat atau jenis string, yang ditentukan di dalamnya.
Deklarasikan variabel xml yang diketik dengan menggunakan koleksi skema XML.
Tetapkan contoh instans XML ke variabel .
Kueri variabel untuk mengilustrasikan
instance of
perilaku saat berhadapan dengan jenis gabungan.
Ini adalah kueri:
CREATE XML SCHEMA COLLECTION MyTestSchema AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns" xmlns:ns="http://ns">
<simpleType name="MyUnionType">
<union memberTypes="integer string"/>
</simpleType>
<element name="TestElement" type="ns:MyUnionType"/>
</schema>'
Go
Kueri berikut mengembalikan False, karena SequenceType yang ditentukan dalam instance of
ekspresi bukanlah induk tertinggi dari jenis ekspresi yang ditentukan. Artinya, nilai adalah jenis bilangan <TestElement
> bulat. Induk tertinggi adalah xs:desimal. Namun, itu tidak ditentukan sebagai operand kedua ke instance of
operator.
SET QUOTED_IDENTIFIER ON
DECLARE @var XML(MyTestSchema)
SET @var = '<TestElement xmlns="http://ns">123</TestElement>'
SELECT @var.query('declare namespace ns="http://ns"
data(/ns:TestElement[1]) instance of xs:integer')
go
Karena induk tertinggi xs:integer adalah xs:desimal, kueri akan mengembalikan True jika Anda mengubah kueri dan menentukan xs:desimal sebagai SequenceType dalam kueri.
SET QUOTED_IDENTIFIER ON
DECLARE @var XML(MyTestSchema)
SET @var = '<TestElement xmlns="http://ns">123</TestElement>'
SELECT @var.query('declare namespace ns="http://ns"
data(/ns:TestElement[1]) instance of xs:decimal')
go
Contoh D
Dalam contoh ini, Anda terlebih dahulu membuat koleksi skema XML dan menggunakannya untuk mengetik variabel xml . Variabel xml yang diketik kemudian dikueri untuk mengilustrasikan instance of
fungsionalitas.
Koleksi skema XML berikut mendefinisikan jenis sederhana, myType, dan elemen, <root
>, dari jenis myType:
drop xml schema collection SC
go
CREATE XML SCHEMA COLLECTION SC AS '
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="myNS" xmlns:ns="myNS"
xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">
<import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
<simpleType name="myType">
<restriction base="s:varchar">
<maxLength value="20"/>
</restriction>
</simpleType>
<element name="root" type="ns:myType"/>
</schema>'
Go
Sekarang buat variabel xml yang ditik dan kueri:
DECLARE @var XML(SC)
SET @var = '<root xmlns="myNS">My data</root>'
SELECT @var.query('declare namespace sqltypes = "https://schemas.microsoft.com/sqlserver/2004/sqltypes";
declare namespace ns="myNS";
data(/ns:root[1]) instance of ns:myType')
go
Karena jenis myType berasal dari pembatasan dari jenis varchar yang ditentukan dalam skema sqltypes, instance of
juga akan mengembalikan True.
DECLARE @var XML(SC)
SET @var = '<root xmlns="myNS">My data</root>'
SELECT @var.query('declare namespace sqltypes = "https://schemas.microsoft.com/sqlserver/2004/sqltypes";
declare namespace ns="myNS";
data(/ns:root[1]) instance of sqltypes:varchar?')
go
Contoh E
Dalam contoh berikut, ekspresi mengambil salah satu nilai atribut IDREFS dan digunakan untuk menentukan apakah nilainya berjenis instance of
IDREF. Contoh melakukan hal berikut:
Membuat koleksi skema XML di mana <>
Customer
elemen memiliki atribut jenis IDREFS OrderList, dan>Order
< elemen memiliki atribut jenis ID OrderID.Membuat variabel xml yang ditik dan menetapkan contoh instans XML ke dalamnya.
Menentukan kueri terhadap variabel. Ekspresi kueri mengambil nilai ID pesanan pertama dari atribut jenis IDRERS OrderList dari atribut pertama <
Customer
>. Nilai yang diambil adalah jenis IDREF. Oleh karena itu,instance of
mengembalikan True.
create xml schema collection SC as
'<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:Customers="Customers" targetNamespace="Customers">
<element name="Customers" type="Customers:CustomersType"/>
<complexType name="CustomersType">
<sequence>
<element name="Customer" type="Customers:CustomerType" minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="OrderType">
<sequence minOccurs="0" maxOccurs="unbounded">
<choice>
<element name="OrderValue" type="integer" minOccurs="0" maxOccurs="unbounded"/>
</choice>
</sequence>
<attribute name="OrderID" type="ID" />
</complexType>
<complexType name="CustomerType">
<sequence minOccurs="0" maxOccurs="unbounded">
<choice>
<element name="spouse" type="string" minOccurs="0" maxOccurs="unbounded"/>
<element name="Order" type="Customers:OrderType" minOccurs="0" maxOccurs="unbounded"/>
</choice>
</sequence>
<attribute name="CustomerID" type="string" />
<attribute name="OrderList" type="IDREFS" />
</complexType>
</schema>'
go
declare @x xml(SC)
set @x='<CustOrders:Customers xmlns:CustOrders="Customers">
<Customer CustomerID="C1" OrderList="OrderA OrderB" >
<spouse>Jenny</spouse>
<Order OrderID="OrderA"><OrderValue>11</OrderValue></Order>
<Order OrderID="OrderB"><OrderValue>22</OrderValue></Order>
</Customer>
<Customer CustomerID="C2" OrderList="OrderC OrderD" >
<spouse>John</spouse>
<Order OrderID="OrderC"><OrderValue>33</OrderValue></Order>
<Order OrderID="OrderD"><OrderValue>44</OrderValue></Order>
</Customer>
<Customer CustomerID="C3" OrderList="OrderE OrderF" >
<spouse>Jane</spouse>
<Order OrderID="OrderE"><OrderValue>55</OrderValue></Order>
<Order OrderID="OrderF"><OrderValue>55</OrderValue></Order>
</Customer>
<Customer CustomerID="C4" OrderList="OrderG" >
<spouse>Tim</spouse>
<Order OrderID="OrderG"><OrderValue>66</OrderValue></Order>
</Customer>
<Customer CustomerID="C5" >
</Customer>
<Customer CustomerID="C6" >
</Customer>
<Customer CustomerID="C7" >
</Customer>
</CustOrders:Customers>'
select @x.query(' declare namespace CustOrders="Customers";
data(CustOrders:Customers/Customer[1]/@OrderList)[1] instance of xs:IDREF ? ') as XML_result
Batasan Implementasi
Ini adalah batasannya:
Jenis urutan schema-element() dan schema-attribute() tidak didukung untuk perbandingan
instance of
dengan operator.Urutan penuh, misalnya,
(1,2) instance of xs:integer*
, tidak didukung.Saat Anda menggunakan bentuk jenis urutan elemen() yang menentukan nama jenis, seperti
element(ElementName, TypeName)
, jenis harus memenuhi syarat dengan tanda tanya (?). Misalnya,element(Title, xs:string?)
menunjukkan bahwa elemen mungkin null. SQL Server tidak mendukung deteksi run-time properti xsi:nil dengan menggunakaninstance of
.Jika nilai berasal dari elemen atau atribut yang diketik
Expression
sebagai gabungan, SQL Server hanya dapat mengidentifikasi primitif, bukan turunan, jenis dari mana jenis nilai diturunkan. Misalnya, jika <e1
> didefinisikan untuk memiliki jenis statis (xs:integer | xs:string), berikut ini akan mengembalikan False.data(<e1>123</e1>) instance of xs:integer
Namun,
data(<e1>123</e1>) instance of xs:decimal
akan mengembalikan True.Untuk jenis urutan processing-instruction() dan document-node(), hanya formulir tanpa argumen yang diizinkan. Misalnya,
processing-instruction()
diizinkan, tetapiprocessing-instruction('abc')
tidak diizinkan.
cast sebagai Operator
Ekspresi cast as dapat digunakan untuk mengonversi nilai ke jenis data tertentu. Contohnya:
Expression cast as AtomicType?
Di SQL Server, tanda tanya (?) diperlukan setelah AtomicType
. Misalnya, seperti yang diperlihatkan dalam kueri berikut, "2" cast as xs:integer?
mengonversi nilai string menjadi bilangan bulat:
declare @x xml
set @x=''
select @x.query('"2" cast as xs:integer?')
Dalam kueri berikut, data() mengembalikan nilai yang ditik dari atribut ProductModelID, jenis string. Operator cast as
mengonversi nilai menjadi xs:integer.
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD)
SELECT CatalogDescription.query('
data(/PD:ProductDescription[1]/@ProductModelID) cast as xs:integer?
') as Result
FROM Production.ProductModel
WHERE ProductModelID = 19
Penggunaan eksplisit data() tidak diperlukan dalam kueri ini. Ekspresi cast as
melakukan atomisasi implisit pada ekspresi input.
Fungsi Konstruktor
Anda dapat menggunakan fungsi konstruktor jenis atomik. Misalnya, alih-alih menggunakan cast as
operator, "2" cast as xs:integer?
, Anda dapat menggunakan fungsi konstruktor xs:integer(), seperti dalam contoh berikut:
declare @x xml
set @x=''
select @x.query('xs:integer("2")')
Contoh berikut mengembalikan nilai xs:date yang sama dengan 2000-01-01Z.
declare @x xml
set @x=''
select @x.query('xs:date("2000-01-01Z")')
Anda juga dapat menggunakan konstruktor untuk jenis atom yang ditentukan pengguna. Misalnya, jika koleksi skema XML yang terkait dengan jenis data XML menentukan jenis sederhana, konstruktor myType() dapat digunakan untuk mengembalikan nilai jenis tersebut.
Batasan Implementasi
Ekspresi XQuery mengetik, dapat dicor, dan diperlakukan tidak didukung.
cast sebagai memerlukan tanda tanya (?) setelah jenis atom.
xs:QName tidak didukung sebagai jenis untuk transmisi. Gunakan expanded-QName sebagai gantinya.
xs:date, xs:time, dan xs:datetime memerlukan zona waktu, yang ditunjukkan oleh Z.
Kueri berikut gagal, karena zona waktu tidak ditentukan.
DECLARE @var XML SET @var = '' SELECT @var.query(' <a>{xs:date("2002-05-25")}</a>') go
Dengan menambahkan indikator zona waktu Z ke nilai , kueri berfungsi.
DECLARE @var XML SET @var = '' SELECT @var.query(' <a>{xs:date("2002-05-25Z")}</a>') go
Ini adalah hasilnya:
<a>2002-05-25Z</a>