SequenceType 式 (XQuery)
適用対象:SQL Server
XQuery では、値は常にシーケンスです。 値の型はシーケンス型と呼ばれます。 シーケンス型は、XQuery 式 のインスタンス で使用できます。 XQuery 式で型を参照する必要があるときは、XQuery 仕様に記載されている SequenceType 構文を使用します。
アトミック型名は、 XQuery 式としてキャスト で使用することもできます。 SQL Serverでは、SequenceTypes で XQuery 式としてキャストされた および のインスタンスが部分的にサポートされています。
Operator のインスタンス
operator のインスタンス を使用して、指定された式の値の動的な型 (実行時) を決定できます。 次に例を示します。
Expression instance of SequenceType[Occurrence indicator]
演算子 である instance of
は Occurrence indicator
、カーディナリティ、結果のシーケンス内の項目数を指定します。 これが指定されていない場合、カーディナリティは 1 と見なされます。 SQL Serverでは、疑問符 (?) 発生インジケーターのみがサポートされています。 ? 出現インジケーターは、0 個または 1 個の項目を返すことができることをExpression
示します。 ? 出現インジケーターが指定されている場合、instance of
単一シーケンスと空のExpression
シーケンスのどちらを返すかに関係なく、型が指定した SequenceType
と一致する場合Expression
は True を返します。
? 出現インジケーターが指定されていない場合、型が指定したと一致しExpression
、sequence of
シングルトンをExpression
Type
返す場合にのみ True を返します。
メモプラス記号 (+) とアスタリスク (*) の出現インジケーターは、SQL Serverではサポートされていません。
次の例は、XQuery 演算子のインスタンスの使用方法を 示しています。
例 A
次の例では、 xml 型変数を作成し、それに対するクエリを指定します。 クエリ式は、最初の instance of
オペランドによって返される値の動的型が、2 番目のオペランドで指定された型と一致するかどうかを判断する演算子を指定します。
次のクエリは True を返します。125 値は指定した型 xs:integer のインスタンスであるためです。
declare @x xml
set @x=''
select @x.query('125 instance of xs:integer')
go
次のクエリでは、最初のオペランドの式 /a[1] から返される値が要素なので True が返されます。
declare @x xml
set @x='<a>1</a>'
select @x.query('/a[1] instance of element()')
go
同様に、次のクエリでは最初の式に含まれている式の値の型が属性型なので、instance of
から True が返されます。
declare @x xml
set @x='<a attr1="x">1</a>'
select @x.query('/a[1]/@attr1 instance of attribute()')
go
次の例では、 式 data(/a[1]
は xdt:untypedAtomic として型指定されたアトミック値を返します。 したがって、 は instance of
True を返します。
declare @x xml
set @x='<a>1</a>'
select @x.query('data(/a[1]) instance of xdt:untypedAtomic')
go
次のクエリでは、 式 data(/a[1]/@attrA
は型指定されていないアトミック値を返します。 したがって、 は 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
例 B
この例では、AdventureWorks サンプル データベースの型指定された XML 列に対してクエリを実行しています。 クエリ対象の列に関連付けられている XML スキーマ コレクションは、入力情報を提供します。
式の data() は、列に関連付けられているスキーマに従って型が xs:string である ProductModelID 属性の型指定された値を返します。 したがって、 は 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
詳細については、「 型指定された XML と型指定されていない XML の比較」を参照してください。
次のクエリでは、Boolean instance of
式を使用して、LocationID 属性が 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
CatalogDescription 型の XML 列に対して、次のクエリを指定します。 この列に関連付けられた XML スキーマ コレクションにより、型指定情報が提供されます。
クエリでは、 element(ElementName, ElementType?)
式の テストを instance of
使用して、 /PD:ProductDescription[1]
が特定の名前と型の要素ノードを返すかどうかを確認します。
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
クエリは True を返します。
例 C
共用体の型を使用する場合、instance of
SQL Serverの式には制限があります。具体的には、要素または属性の型が共用体型の場合、instance of
正確な型が決定されない可能性があります。 したがって、SequenceType で使用されているアトミック型が、simpleType 階層内にある式の実際の型の最上位の親でない限り、クエリから False が返されます。 つまり、SequenceType で指定されるアトミック型は、anySimpleType の直接の子である必要があります。 型階層の詳細については、「 XQuery の型キャストルール」を参照してください。
次のクエリの例では、次の処理を実行します。
整数型や文字列型などの共用体型を定義した XML スキーマ コレクションを作成します。
XML スキーマ コレクションを使用して、型指定された xml 変数を宣言します。
サンプル XML インスタンスを 変数に割り当てます。
変数にクエリして、共用体型を処理するときの
instance of
の動作を示します。
クエリは次のとおりです。
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
次のクエリでは、instance of
式に指定している SequenceType が、指定した式の実際の型の最上位の親ではないので False が返されます。 つまり、 の <TestElement
> 値は整数型です。 最上位の親は xs:decimal です。 しかし、この型が instance of
演算子の 2 つ目のオペランドとして指定されていません。
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
xs:integer の最上位の親は xs:decimal であるため、クエリを変更し、クエリで SequenceType として xs:decimal を指定すると、クエリは True を返します。
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
例 D
この例では、まず XML スキーマ コレクションを作成し、それを使用して xml 変数を入力します。 その後、型指定された xml 変数に対してクエリが実行され、機能が instance of
示されます。
次の XML スキーマ コレクションでは、myType 型の単純型と、myType 型の 要素 <root
>を定義します。
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
次に、型指定された xml 変数を作成し、クエリを実行します。
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
myType 型は、sqltypes スキーマで定義されている varchar 型から制限によって派生するため、 instance of
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
例 E
次の例では、式で IDREFS 属性のいずれかの値を取得し、instance of
を使用して値が IDREF 型かどうかを判断しています。 この例では、次の処理を実行します。
要素に <>
Customer
OrderList IDREFS 型属性があり<Order
>、その要素に OrderID ID 型属性が含まれる XML スキーマ コレクションを作成します。型指定された xml 変数を作成し、それにサンプル XML インスタンスを割り当てます。
変数に対してクエリを指定します。 クエリ式は、最初の の OrderList IDRERS 型属性から最初 <
Customer
>の注文 ID 値を取得します。 取得される値は IDREF 型です。 したがって、instance of
は 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
実装の制限事項
制限事項は次のとおりです。
schema-element() および schema-attribute() シーケンス型は、 演算子との
instance of
比較ではサポートされていません。完全なシーケンス (例:
(1,2) instance of xs:integer*
) はサポートされていません。などの
element(ElementName, TypeName)
型名を指定する element() シーケンス型の形式を使用している場合、型は疑問符 (?) で修飾する必要があります。 たとえば、element(Title, xs:string?)
は要素が NULL であることを示します。 SQL Server では、 を使用instance of
した xsi:nil プロパティの実行時検出はサポートされていません。の
Expression
値が和集合として型指定された要素または属性から取得される場合、SQL Serverは、値の型が派生した型ではなく、派生型のプリミティブのみを識別できます。 たとえば、 が (xs:integer | xs:string) の静的型として定義されている場合 <e1
> 、次は False を返します。data(<e1>123</e1>) instance of xs:integer
ただし、
data(<e1>123</e1>) instance of xs:decimal
は True を返します。processing-instruction() および document-node() シーケンス型の場合、引数のないフォームのみが許可されます。 たとえば、
processing-instruction()
は使用できますが、processing-instruction('abc')
は使用できません。
演算子としてキャスト
式 としてのキャスト は、値を特定のデータ型に変換するために使用できます。 次に例を示します。
Expression cast as AtomicType?
SQL Serverでは、 の後AtomicType
に疑問符 (?) が必要です。 たとえば、次のクエリに示すように、 "2" cast as xs:integer?
文字列値を整数に変換します。
declare @x xml
set @x=''
select @x.query('"2" cast as xs:integer?')
次のクエリでは、 data() は ProductModelID 属性の型指定された値 (文字列型) を返します。 演算子は cast as
、値を 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
このクエリでは 、data() を明示的に使用する必要はありません。 式は cast as
、入力式に対して暗黙的なアトミック化を実行します。
コンストラクター関数
アトミック型コンストラクター関数を使用できます。 たとえば、次の例のように、 "2" cast as xs:integer?
演算子 を使用cast as
する代わりに、xs:integer() コンストラクター関数を使用できます。
declare @x xml
set @x=''
select @x.query('xs:integer("2")')
次の例では、2000-01-01Z に等しい xs:date 型の値が返されます。
declare @x xml
set @x=''
select @x.query('xs:date("2000-01-01Z")')
ユーザー定義のアトミック型にコンストラクターを使用することもできます。 たとえば、XML データ型に関連付けられている XML スキーマ コレクションで単純型が定義されている場合、 myType() コンストラクターを使用してその型の値を返すことができます。
実装の制限事項
XQuery 式 typeswitch、castable、treat はサポートされていません。
疑問符が必要なとしてキャスト (?)アトミック型の後。
xs:QName はキャストの型としてサポートされていません。 代わりに expanded-QName を 使用してください。
xs:date、 xs:time、 xs:datetime には、Z で示されるタイム ゾーンが必要です。
タイム ゾーンが指定されていないため、次のクエリは失敗します。
DECLARE @var XML SET @var = '' SELECT @var.query(' <a>{xs:date("2002-05-25")}</a>') go
Z タイム ゾーン インジケーターを値に追加すると、クエリが機能します。
DECLARE @var XML SET @var = '' SELECT @var.query(' <a>{xs:date("2002-05-25Z")}</a>') go
結果を次に示します。
<a>2002-05-25Z</a>