與階層有關的 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
.