以下是在區分大小寫的情況下,具有名稱的列集資料行映射到生成 XML 的具體條件:
數據行名稱開頭為 at 符號 (@)。
數據行名稱開頭不是以符號 (@) 開頭。
欄位名稱不是以在符號 (@) 開頭,而且包含斜線標記 (/)。
數個欄共用相同的前綴。
一個欄位的名稱不同。
欄位名稱開頭為「@」符號
如果數據行名稱開頭為 at 符號 (@) 且不包含斜線標記 (/),則會建立具有對應數據行值之元素的屬性 <row> 。 例如,下列查詢會傳回兩個數據行 (@PmId, Name) 數據列集。 在產生的 XML 中, PmId 屬性會新增至對應的 <row> 專案,並將 ProductModelID 的值指派給它。
SELECT ProductModelID as "@PmId",
Name
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH
go
以下是結果:
<row PmId="7">
<Name>HL Touring Frame</Name>
</row>
請注意,屬性必須位於相同層級的任何其他節點類型之前,例如元素節點和文字節點。 下列查詢會傳回錯誤:
SELECT Name,
ProductModelID as "@PmId"
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH
go
欄位名稱不是以@符號開頭
如果欄名稱不是以 at sign(@)開頭,不是 XPath 節點測試之一,且不包含斜線標記(/),則預設會建立作為行元素的子元素的 XML 元素,例如 <row>。
下列查詢會指定數據行名稱、結果。 因此,專案 <result> 子系會新增至 <row> 專案。
SELECT 2+2 as result
for xml PATH
以下是結果:
<row>
<result>4</result>
</row>
下列查詢會針對針對 xml 類型的 Instructions 數據行指定的 XQuery 所傳回的 XML ,指定數據行名稱 ManuWorkCenterInformation。 因此,<ManuWorkCenterInformation> 元素會新增為 <row> 元素的子元素。
SELECT
ProductModelID,
Name,
Instructions.query('declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/MI:root/MI:Location
') as ManuWorkCenterInformation
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH
go
以下是結果:
<row>
<ProductModelID>7</ProductModelID>
<Name>HL Touring Frame</Name>
<ManuWorkCenterInformation>
<MI:Location ...LocationID="10" ...></MI:Location>
<MI:Location ...LocationID="20" ...></MI:Location>
...
</ManuWorkCenterInformation>
</row>
資料行名稱不是以 At Sign 開頭 (@) 且包含斜線標記 (/)
如果數據行名稱不是以符號 (@) 開頭,但包含斜線標記 (/),則數據行名稱會指出 XML 階層。 例如,如果數據行名稱是 「Name1/Name2/Name3.../Namen 」,則每個 Namei 代表目前數據列元素中巢狀的元素名稱(適用於 i=1),或位於名稱為 Namei-1 的專案底下。 如果 Namen 開頭為 '@',則會對應至 Namen-1 元素的屬性。
例如,下列查詢會傳回員工標識符和名稱,其表示為包含 First、Middle 和 Last name 的複雜元素 EmpName。
SELECT EmployeeID "@EmpID",
FirstName "EmpName/First",
MiddleName "EmpName/Middle",
LastName "EmpName/Last"
FROM HumanResources.Employee E, Person.Contact C
WHERE E.EmployeeID = C.ContactID
AND E.EmployeeID=1
FOR XML PATH
數據行名稱會在PATH模式中建構 XML 時當做路徑使用。 包含員工標識碼值的數據行名稱,開頭為 『@』。因此, 屬性 EmpID 會新增至 <row> 專案。 所有其他數據行都會在表示階層的數據行名稱中包含斜線標記 ('/')。 產生的 XML 會在 <row> 元素下具有 <EmpName> 子系,而 <EmpName> 子系將會有 <First>、<Middle> 和 <Last> 元素子系。
<row EmpID="1">
<EmpName>
<First>Gustavo</First>
<Last>Achong</Last>
</EmpName>
</row>
員工中間名是 null,而且根據預設,Null 值會對應至元素或屬性的不存在。 如果您想為 NULL 值生成元素,可以在查詢中使用 XSINIL 來指定 ELEMENTS 指示詞。
SELECT EmployeeID "@EmpID",
FirstName "EmpName/First",
MiddleName "EmpName/Middle",
LastName "EmpName/Last"
FROM HumanResources.Employee E, Person.Contact C
WHERE E.EmployeeID = C.ContactID
AND E.EmployeeID=1
FOR XML PATH, ELEMENTS XSINIL
以下是結果:
<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
EmpID="1">
<EmpName>
<First>Gustavo</First>
<Middle xsi:nil="true" />
<Last>Achong</Last>
</EmpName>
</row>
根據預設,PATH 模式會產生以專案為中心的 XML。 因此,在PATH模式查詢中指定ELEMENTS指示詞沒有任何作用。 不過,如上一個範例所示,ELEMENTS 指示詞對 XSINIL 很有用,可產生 Null 值的元素。
除了標識符和名稱,下列查詢會擷取員工位址。 根據地址欄位名稱中的路徑,<Address> 元素子元素會新增到 <row> 元素中,而地址詳細資料則會新增為 <Address> 元素的子元素。
SELECT EmployeeID "@EmpID",
FirstName "EmpName/First",
MiddleName "EmpName/Middle",
LastName "EmpName/Last",
AddressLine1 "Address/AddrLine1",
AddressLine2 "Address/AddrLIne2",
City "Address/City"
FROM HumanResources.Employee E, Person.Contact C, Person.Address A
WHERE E.EmployeeID = C.ContactID
AND E.AddressID = A.AddressID
AND E.EmployeeID=1
FOR XML PATH
以下是結果:
<row EmpID="1">
<EmpName>
<First>Gustavo</First>
<Last>Achong</Last>
</EmpName>
<Address>
<AddrLine1>7726 Driftwood Drive</AddrLine1>
<City>Monroe</City>
</Address>
</row>
數個欄共用相同的路徑前置詞
如果後續的數個數據行共用相同的路徑前置詞,它們會以相同名稱分組在一起。 如果使用不同的命名空間前置詞,即使它們系結至相同的命名空間,路徑也會被視為不同。 在上一個查詢中,FirstName、MiddleName 和 LastName 欄位共用相同的 EmpName 前綴。因此,它們會新增為 <EmpName> 元素的子元素。 這也是您在上一個範例中建立 <Address> 項目的情況。
一個數據行有不同的名稱
如果兩者之間出現名稱不同的數據行,則會中斷群組,如下列修改過的查詢所示。 查詢會藉由在 FirstName 和 MiddleName 資料行之間新增地址數據行,來中斷 FirstName、MiddleName 和 LastName 的群組,如先前查詢中所指定。
SELECT EmployeeID "@EmpID",
FirstName "EmpName/First",
AddressLine1 "Address/AddrLine1",
AddressLine2 "Address/AddrLIne2",
City "Address/City",
MiddleName "EmpName/Middle",
LastName "EmpName/Last"
FROM HumanResources.EmployeeAddress E, Person.Contact C, Person.Address A
WHERE E.EmployeeID = C.ContactID
AND E.AddressID = A.AddressID
AND E.EmployeeID=1
FOR XML PATH
因此,查詢會建立兩 <EmpName> 個元素。 第一個<EmpName>元素具有<FirstName>子元素,而第二個<EmpName>元素具有<MiddleName>和<LastName>子元素。
以下是結果:
<row EmpID="1">
<EmpName>
<First>Gustavo</First>
</EmpName>
<Address>
<AddrLine1>7726 Driftwood Drive</AddrLine1>
<City>Monroe</City>
</Address>
<EmpName>
<Last>Achong</Last>
</EmpName>
</row>