コンストラクタ関数 (XQuery)
コンストラクタ関数は、指定された入力から、XSD の組み込みのアトミック型またはユーザー定義のアトミック型のインスタンスを生成します。
構文
TYP($atomicvalue as xdt:anyAtomicType?
) as TYP?
引数
- $strval
変換される文字列。
- TYP
任意の組み込み XSD 型。
解説
コンストラクタは基本データ型、および派生されたアトミック XSD 型に対してサポートされています。ただし、xs:duration のサブタイプ (xdt:yearMonthDuration、xdt:dayTimeDuration など)、xs:QName、xs:NMTOKEN、および xs:NOTATION はサポートされません。関連するスキーマ コレクションで利用可能なユーザー定義のアトミック型も使用できます。ただし、それらは次に示す型から直接または間接的に派生されている必要があります。
サポートされている基本データ型
サポートされている基本データ型を次に示します。
- xs:string
- xs:boolean
- xs:decimal
- xs:float
- xs:double
- xs:duration
- xs:dateTime
- xs:time
- xs:date
- xs:gYearMonth
- xs:gYear
- xs:gMonthDay
- xs:gDay
- xs:gMonth
- xs:hexBinary
- xs:base64Binary
- xs:anyURI
サポートされている派生型
サポートされている派生型を次に示します。
- xs:normalizedString
- xs:token
- xs:language
- xs:Name
- xs:NCName
- xs:ID
- xs:IDREF
- xs:ENTITY
- xs:integer
- xs:nonPositiveInteger
- xs:negativeInteger
- xs:long
- xs:int
- xs:short
- xs:byte
- xs:nonNegativeInteger
- xs:unsignedLong
- xs:unsignedInt
- xs:unsignedShort
- xs:unsignedByte
- xs:positiveInteger
SQL Server では、次に示す方法で、コンストラクタ関数の呼び出しの際に定数の組み合わせもサポートしています。
- 引数が文字列リテラルの場合、式はコンパイル時に評価されます。値が型に関する制約を満たしていない場合、静的エラーが発生します。
- 引数が別の型のリテラルである場合、式はコンパイル時に評価されます。値が型に関する制約を満たしていない場合、空のシーケンスが返されます。
例
このトピックでは、AdventureWorks データベースのさまざまな xml 型列に格納される XML インスタンスに対する XQuery の例について説明します。これらの各列の概要については、「AdventureWorks データベースの xml データ型表現」を参照してください。
A. dateTime() XQuery 関数を使用して、製品の説明の古いバージョンを取得する
この例では、サンプルの XML ドキュメントがまず xml 型の変数に割り当てられます。このドキュメントには 3 つのサンプル <ProductDescription
> 要素が含まれます。各要素には <DateCreated
> 子要素が含まれています。
次に、その変数がクエリされ、指定された日時より前に作成された製品の説明だけを取得します。このクエリでは、比較を行うために xs:dateTime() コンストラクタ関数を使用して、日時を型指定しています。
declare @x xml
set @x = '<root>
<ProductDescription ProductID="1" >
<DateCreated DateValue="2000-01-01T00:00:00Z" />
<Summary>Some Summary description</Summary>
</ProductDescription>
<ProductDescription ProductID="2" >
<DateCreated DateValue="2001-01-01T00:00:00Z" />
<Summary>Some Summary description</Summary>
</ProductDescription>
<ProductDescription ProductID="3" >
<DateCreated DateValue="2002-01-01T00:00:00Z" />
<Summary>Some Summary description</Summary>
</ProductDescription>
</root>'
select @x.query('
for $PD in /root/ProductDescription
where xs:dateTime(data( ($PD/DateCreated/@DateValue)[1] )) < xs:dateTime("2001-01-01T00:00:00Z")
return
element Product
{
( attribute ProductID { data($PD/@ProductID ) },
attribute DateCreated { data( ($PD/DateCreated/@DateValue)[1] ) } )
}
')
上のクエリに関して、次の点に注意してください。
- FOR ... WHERE ループ構造を使用して、WHERE 句で指定された条件を満たす <ProductDescription> 要素を取得しています。
- dateTime() コンストラクタ関数を使用して、日時の適切な比較を行えるように dateTime 型の値を生成しています。
- この後、クエリは結果の XML を出力します。一連の属性を構成しているため、XML の構造にコンマとかっこが使用されています。
結果を次に示します。
<Product
ProductID="1"
DateCreated="2000-01-01T00:00:00Z"/>