共用方式為


有名稱的資料行

適用於: SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體

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

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

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

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

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

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

資料行名稱以 @ 符號開頭

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

SELECT ProductModelID as "@PmId",
       Name
FROM Production.ProductModel
WHERE ProductModelID = 7
FOR XML PATH;

以下是結果:

<row PmId="7">
  <Name>HL Touring Frame</Name>
</row>

在相同的層級中,屬性必須在任何其他節點類型的前面,例如元素節點與文字節點。 下列查詢將傳回錯誤:

SELECT Name,
       ProductModelID as "@PmId"
FROM Production.ProductModel
WHERE ProductModelID = 7
FOR XML PATH;

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

如果資料行名稱不是以 @ 符號開頭、不是其中一個 XPath 節點測試,而且不包含斜線 (/),預設會建立屬於資料列元素 row 之子元素的 XML 元素。

下列查詢指定資料行名稱,也就是結果。 因此,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="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
     /MI:root/MI:Location
    ') as ManuWorkCenterInformation
FROM Production.ProductModel
WHERE ProductModelID=7
FOR XML PATH;

以下是結果:

<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) 中,或是在具有 i-1名稱之元素的底下。 如果 Namen@ 開頭,它會對應至 Namen-1 元素的屬性。

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

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 子項目將有 FirstMiddleLast 子項目。

<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>

數個資料行共用相同的路徑前置詞

如果數個後續的資料行共用相同的路徑前置詞,則會在相同的名稱下將它們群組在一起。 即使不同的命名空間前置詞是與相同的命名空間繫結,但仍使用了它們,就會將路徑視為不同。 在上一個查詢中,FirstNameMiddleNameLastName 資料行會共用相同的 EmpName 前置詞。 因此,它們會新增為 EmpName 元素的子系。 當您在上述範例中建立 Address 項目時也是如此。

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

如果具有不同名稱的資料行出現在其間,它將會拆散群組,如下列修改的查詢所示。 查詢會在 FirstNameMiddleName 資料行之間新增地址資料行,以拆散上述查詢所指定的 FirstNameMiddleNameLastName 的群組。

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 項目則具有 MiddleNameLastName 子項目。

以下是結果:

<row EmpID="1">
  <EmpName>
    <First>Gustavo</First>
  </EmpName>
  <Address>
    <AddrLine1>7726 Driftwood Drive</AddrLine1>
    <City>Monroe</City>
  </Address>
  <EmpName>
    <Last>Achong</Last>
  </EmpName>
</row>

另請參閱