階層に関係する XQuery
適用対象:SQL Server
AdventureWorks データベースのほとんどの xml 型の列は、半構造化ドキュメントです。 したがって、各行に格納されているドキュメントは異なる場合があります。 このトピックのクエリ サンプルでは、これらのさまざまなドキュメントから情報を抽出する方法について説明します。
例
A. 製造指示書から、作業センターの場所と、それらの場所での最初の製造ステップを一緒に取得します
製品モデル 7 の場合、クエリは、ProductModelID 属性と ProductModelName 属性と 1 つ以上<>Location
の子要素を持つ 要素を含む <ManuInstr
> XML を構築します。
各 <Location
> 要素には、独自の属性セットと 1 つの <step
> 子要素があります。 この <step
> 子要素は、作業センターの場所での最初の製造ステップです。
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
\<ManuInstr ProdModelID = "{sql:column("Production.ProductModel.ProductModelID") }"
ProductModelName = "{ sql:column("Production.ProductModel.Name") }" >
{
for $wc in //AWMI:root/AWMI:Location
return
<Location>
{$wc/@* }
<step1> { string( ($wc//AWMI:step)[1] ) } </step1>
</Location>
}
</ManuInstr>
') as Result
FROM Production.ProductModel
WHERE ProductModelID=7
上のクエリに関して、次の点に注意してください。
XQuery Prolog の namespace キーワードは、名前空間プレフィックスを定義します。 このプレフィックスは、クエリ本文の後半で使用されます。
コンテキスト切り替えトークン {) と (}) は、クエリを XML 構築からクエリ評価に切り替えるために使用されます。
sql:column() は、構築中の XML にリレーショナル値を含めるために使用されます。
要素を <
Location
> 構築する場合、$wc/@* はすべての作業センターの場所属性を取得します。string() 関数は、 要素から文字列値を<
step
>返します。
これは部分的な結果です。
<ManuInstr ProdModelID="7" ProductModelName="HL Touring Frame">
<Location LocationID="10" SetupHours="0.5"
MachineHours="3" LaborHours="2.5" LotSize="100">
<step1>Insert aluminum sheet MS-2341 into the T-85A
framing tool.</step1>
</Location>
<Location LocationID="20" SetupHours="0.15"
MachineHours="2" LaborHours="1.75" LotSize="1">
<step1>Assemble all frame components following
blueprint 1299.</step1>
</Location>
...
</ManuInstr>
B. AdditionalContactInfo 列のすべての電話番号の検索
次のクエリでは、 要素の階層全体を検索して、特定の顧客連絡先の追加の電話番号を <telephoneNumber
> 取得します。 要素は <telephoneNumber
> 階層内の任意の場所に表示できるため、クエリでは、検索で子孫演算子と自己演算子 (//) が使用されます。
SELECT AdditionalContactInfo.query('
declare namespace ci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
for $ph in /ci:AdditionalContactInfo//act:telephoneNumber
return
$ph/act:number
') as x
FROM Person.Contact
WHERE ContactID = 1
結果を次に示します。
\<act:number
xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
111-111-1111
\</act:number>
\<act:number
xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">
112-111-1111
\</act:number>
最上位の電話番号 (具体的には <telephoneNumber
> の子要素 <AdditionalContactInfo
>) のみを取得するには、クエリの FOR 式が に変更されます。
for $ph in /ci:AdditionalContactInfo/act:telephoneNumber
.