共用方式為


有名稱的資料行

以下是具有名稱的資料列集資料行,以區分大小寫的方式對應至產生之 XML 的特定條件:

  • 此資料行名稱以 @ 符號開頭。

  • 此資料行名稱不是以 @ 符號開頭。

  • 此資料行名稱不是以 @ 符號開頭且包含斜線 (/)。

  • 數個資料行共用相同的前置詞。

  • 一個資料行具有不同的名稱。

資料行名稱以 @ 符號開頭

如果資料行名稱是以 @ 符號開頭且不包含斜線 (/),就會建立具有對應資料行值的 <row> 元素之屬性。例如,下列查詢會傳回兩個資料行 (@PmId、Name) 的資料列集。在產生的 XML 中,PmId 屬性會加入對應的 <row> 元素中,並會將 ProductModelID 值指派給該元素。

SELECT ProductModelID as "@PmId",       NameFROM Production.ProductModelWHERE ProductModelID=7FOR 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 符號 (@) 開頭、不是其中一個 XPath 節點測試,而且不包含斜線 (/),預設會建立資料列元素 <row> 的子元素之 XML 元素。

下列查詢指定資料行名稱,也就是結果。因此,<result> 子元素會加入 <row> 元素。

SELECT 2+2 as result
for xml PATH

結果如下:

<row>
  <result>4</result>
</row>

下列查詢會針對 xml 類型的 Instructions 資料行指定之 XQuery 所傳回的 XML,指定資料行名稱 ManuWorkCenterInformation。因此,將以 <row> 元素的子元素加入 <ManuWorkCenterInformation> 元素。

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>

資料行名稱不是以 @ 符號開頭且包含斜線 (/)

如果資料行名稱不是以 @ 符號開頭,但包含斜線 (/),則資料行名稱會指出 XML 階層。例如,如果資料行名稱是 "Name1/Name2/Name3.../Namen ",則每個 Namei 代表一個元素名稱,該元素以巢狀化方式出現在目前資料列元素 (for i=1) 中,或是在具有 Namei-1 名稱之元素的底下。如果 Namen 以 '@' 開頭,它會對應至 Namen-1 元素的屬性。

例如,下列查詢將會傳回員工識別碼與姓名,它們是以複雜的元素 EmpName 所代表,該元素包含姓名的 First、Middle 及 Last。

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 值產生元素,您可以指定具有 XSINL 的 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>

請參閱

概念