次の方法で共有


階層に関係する 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 Prolognamespace キーワードは、名前空間プレフィックスを定義します。 このプレフィックスは、クエリ本文の後半で使用されます。

  • コンテキスト切り替えトークン {) と (}) は、クエリを 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.

関連項目

XQuery の基礎
XML の構築 (XQuery)
XML データ (SQL Server)