共用方式為


與階層有關的 XQuery

適用於:SQL Server

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

範例

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

針對產品模型 7,查詢會建構包含 <ManuInstr> 元素的 XML,其中包含 ProductModelIDProductModelName 屬性,以及一或多個 <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>因為 元素可以出現在階層中的任何位置,因此查詢會在搜尋中使用子代和自我運算子 (/2) 。

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>  

若要只擷取最上層電話號碼,特別是的<AdditionalContactInfo>telephoneNumber><子元素,查詢中的 FOR 運算式會變更為

for $ph in /ci:AdditionalContactInfo/act:telephoneNumber.

另請參閱

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