共用方式為


與階層有關的 XQuery

適用於:SQL Server

AdventureWorks 資料庫中大部分 的 xml 類型資料行 都是半結構化 的檔。 因此,儲存在每個資料列的檔看起來可能不同。 本主題中的查詢範例說明如何從這些各種檔擷取資訊。

範例

A. 從製造指示檔中,擷取工作中心位置以及這些位置的第一個製造步驟

針對產品模型 7,查詢會建構包含 <>ManuInstr 元素的 XML,其中包含 ProductModelID ProductModelName 屬性,以及一或多個 <Location> 子項目。

每個 <Location> 元素都有自己的一組屬性和一個 <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.

另請參閱

XQuery 基本概念
XML 建構 (XQuery)
XML 資料 (SQL Server)