Bagikan melalui


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 <>Customerelemen 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 menggunakan instance 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, tetapi processing-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 asmengonversi 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>  
    

Lihat Juga

Ekspresi XQuery
Sistem Jenis (XQuery)