共用方式為


使用 RAW 模式

RAW 模式會將查詢結果集的每一個資料列轉換成具有泛用識別碼 <row> 的 XML 元素,或選擇性提供的元素名稱。依預設,資料列集內每一個非 NULL 的資料行值,都會對應到一個 <row> 元素的屬性。如果將 ELEMENTS 指示詞加入 FOR XML 子句,則每一個資料行值都會對應到一個 <row> 元素的子元素。您還可以搭配 ELEMENTS 指示詞,選擇性地指定 XSINIL 選項,將結果集的 NULL 資料行值對應到具有 xsi:nil="true" 屬性的元素。

FOR XML 子句中必須指定 BINARY BASE64 選項,才能以 Base64 編碼格式傳回二進位資料。在 RAW 模式中,若未指定 BINARY BASE64 選項,則擷取二進位資料就會發生錯誤。

您可以要求結果 XML 傳回結構描述。指定 XMLDATA 選項可傳回內嵌 XDR 結構描述。指定 XMLSCHEMA 選項則可傳回內嵌 XSD 結構描述。結構描述會出現在資料的開頭。在結果中,結構描述命名空間參考會在每個最上層的元素重複出現。

範例

下列範例中的查詢,顯示 FOR XML RAW 模式如何與不同選項搭配使用。這些查詢中有許多是針對自行車製造說明的 XML 文件來指定的,而這些文件儲存在 ProductModel 資料表的 Instructions 資料行中。如需 XML 指示的詳細資訊,請參閱<在 AdventureWorks 資料庫中的 xml 資料類型表示法>。

A. 將產品型號資訊擷取為 XML 格式

下列查詢會傳回產品型號資訊。RAW 模式是在 FOR XML 子句中指定。

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW;
GO

以下是部份結果:

<row ProductModelID="122" Name="All-Purpose Bike Stand" />

<row ProductModelID="119" Name="Bike Wash" />

您可以指定 ELEMENTS 指示詞,擷取元素中心的 XML。

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, ELEMENTS;
GO

結果如下:

<row>
  <ProductModelID>122</ProductModelID>
  <Name>All-Purpose Bike Stand</Name>
</row>
<row>
  <ProductModelID>119</ProductModelID>
  <Name>Bike Wash</Name>
</row>

您可以選擇性地指定 TYPE 指示詞,將結果擷取為 xml 類型。TYPE 指示詞不會變更結果的內容,只會影響結果的資料類型。

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, TYPE ;
GO

B. 指定 XSINIL 與 ELEMENTS 指示詞,為 Null 資料行值產生元素

下列查詢會指定 ELEMENTS 指示詞,從查詢結果產生元素中心的 XML。

USE AdventureWorks;
GO
SELECT ProductID, Name, Color
FROM Production.Product
FOR XML RAW, ELEMENTS;
GO

以下是部份結果。

<row>
  <ProductID>1</ProductID>
  <Name>Adjustable Race</Name>
</row>
...
<row>
  <ProductID>317</ProductID>
  <Name>LL Crankarm</Name>
  <Color>Black</Color>
</row>

因為某些產品的 Color 資料行是 Null 值,所以產生的 XML 不會產生對應的 <Color> 元素。在 ELEMENTS 後面加上 XSINIL 指示詞,則即使結果集中的 Color 值為 NULL,還是可以為其產生 <Color> 元素。

USE AdventureWorks;
GO
SELECT ProductID, Name, Color
FROM Production.Product
FOR XML RAW, ELEMENTS XSINIL

以下是部份結果:

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ProductID>1</ProductID>
  <Name>Adjustable Race</Name>
  <Color xsi:nil="true" />
</row>
...
<row>
  <ProductID>317</ProductID>
  <Name>LL Crankarm</Name>
  <Color>Black</Color>
</row>

C. 使用 XMLDATA 和 XMLSCHEMA 選項,要求結果傳回結構描述

下列查詢會傳回用於描述文件結構的 XML-DATA 結構描述。

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLDATA
GO

結果如下:

<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" 
        xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <ElementType name="row" content="empty" model="closed">
    <AttributeType name="ProductModelID" dt:type="i4" />
    <AttributeType name="Name" dt:type="string" />
    <attribute type="ProductModelID" />
    <attribute type="Name" />
  </ElementType>
</Schema>
<row xmlns="x-schema:#Schema1" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="x-schema:#Schema1" ProductModelID="119" Name="Bike Wash" />
ms175140.note(zh-tw,SQL.90).gif附註:
<Schema> 會宣告為命名空間。為了在不同 FOR XML 查詢中要求多個 XML-Data 結構描述時避免命名空間衝突,所以在每次執行查詢時都會變更命名空間識別碼 (此範例中為 Schema1)。命名空間識別碼是由 Scheman 所組成,其中 n 是整數。

指定 XMLSCHEMA 選項,則可要求結果傳回 XSD 結構描述。

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLSCHEMA
GO

結果如下:

<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
  <xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
  <xsd:element name="row">
    <xsd:complexType>
      <xsd:attribute name="ProductModelID" type="sqltypes:int" use="required" />
      <xsd:attribute name="Name" use="required">
        <xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">
          <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
            <xsd:maxLength value="50" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" ProductModelID="119" Name="Bike Wash" />

您可以指定目標命名空間 URI,做為 FOR XML 中 XMLSCHEMA 的選擇性引數。這會傳回結構描述中指定的目標命名空間。每次您執行查詢時,此目標命名空間均維持不變。例如,以下是上一個查詢經過修改後的版本,它包含做為引數的命名空間 URI 'urn:example.com'

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLSCHEMA ('urn:example.com')
GO

結果如下:

<xsd:schema targetNamespace="urn:example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
  <xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
  <xsd:element name="row">
    <xsd:complexType>
      <xsd:attribute name="ProductModelID" type="sqltypes:int" use="required" />
      <xsd:attribute name="Name" use="required">
        <xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">
          <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
            <xsd:maxLength value="50" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<row xmlns="urn:example.com" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="urn:example.com" ProductModelID="119" Name="Bike Wash" />

D. 擷取二進位資料

下列查詢會傳回儲存在 varbinary(max) 類型資料行中的產品相片。在查詢中指定 BINARY BASE64 選項,以便將二進位資料以 Base64 編碼格式傳回。

USE AdventureWorks
GO
SELECT ProductPhotoID, ThumbNailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID=1
FOR XML RAW, BINARY BASE64 ;
GO

以下是結果:

<row ProductModelID="1" ThumbNailPhoto="base64 encoded binary data"/>

E. 重新命名 <row> 元素

針對結果集的每一個資料列,RAW 模式會產生一個 <row> 元素。您可以將一個選擇性引數指定給 RAW 模式,以選擇性地為此元素指定另一個名稱,如下列查詢所示。此查詢會針對資料列集的每一個資料列,各傳回一個 <ProductModel> 元素。

SELECT ProductModelID, Name 
FROM Production.ProductModel
WHERE ProductModelID=122
FOR XML RAW ('ProductModel'), ELEMENTS
GO

以下是結果。因為已將 ELEMENTS 指示詞加入查詢中,所以結果會呈現為元素中心。

<ProductModel>
  <ProductModelID>122</ProductModelID>
  <Name>All-Purpose Bike Stand</Name>
</ProductModel> 

F. 為 FOR XML 產生的 XML 指定根元素

藉由在 FOR XML 查詢中指定 ROOT 選項,您可以要求在產生的 XML 中傳回單一的最上層元素,如下列查詢所示。為 ROOT 指示詞所指定的引數,會提供根元素的名稱。

USE AdventureWorks;
GO
SELECT ProductModelID, Name 
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119 or ProductModelID=115
FOR XML RAW, ROOT('MyRoot')
go

以下是結果:

<MyRoot>
  <row ProductModelID="122" Name="All-Purpose Bike Stand" />
  <row ProductModelID="119" Name="Bike Wash" />
  <row ProductModelID="115" Name="Cable Lock" />
</MyRoot>

G. 查詢 xml 類型資料行

下列查詢包含 xml 類型的資料行。此查詢會從 xml 類型之 Instructions 資料行的第一個位置,擷取產品型號識別碼、名稱和製造步驟。

USE AdventureWorks;
GO
SELECT ProductModelID, Name,
   Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   /MI:root/MI:Location[1]/MI:step
') 
FROM Production.ProductModel
FOR XML RAW ('ProductModelData')
GO

以下為結果。請注意,此資料表只儲存某些產品型號的製造指示。製造步驟是以 <ProductModelData> 元素的子元素傳回至結果中。

<ProductModelData ProductModelID="5" Name="HL Mountain Frame" />
<ProductModelData ProductModelID="6" Name="HL Road Frame" />
<ProductModelData ProductModelID="7" Name="HL Touring Frame">
    <MI:step> ... </MI:step>
    <MI:step> ... </MI:step>
 </ProductModelData>

如果查詢對 XQuery 傳回的 XML 指定資料行名稱 (如下列 SELECT 陳述式所指定),則製造步驟會包在具有所指定名稱的元素中。

USE AdventureWorks;
GO
SELECT ProductModelID, Name,
   Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   /MI:root/MI:Location[1]/MI:step
') as ManuSteps
FROM Production.ProductModel
FOR XML RAW ('ProductModelData')
go

以下是結果:

<ProductModelData ProductModelID="5" Name="HL Mountain Frame" />
<ProductModelData ProductModelID="6" Name="HL Road Frame" />
<ProductModelData ProductModelID="7" Name="HL Touring Frame">
  <ManuSteps>
    <MI:step ... </MI:step>
    <MI:step ... </MI:step>
  </ManuSteps>
</ProductModelData>

下列查詢指定了 ELEMENTS 指示詞。因此,傳回的結果會是元素中心的。與 ELEMENTS 指示詞一起指定的 XSINIL 選項會傳回 <ManuSteps> 元素,即使資料列集內相對應的資料行是 NULL 也一樣。

USE AdventureWorks;
GO
SELECT ProductModelID, Name,
   Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   /MI:root/MI:Location[1]/MI:step
') as ManuSteps
FROM Production.ProductModel
FOR XML RAW ('ProductModelData'), root('MyRoot'), ELEMENTS XSINIL
go

以下是結果:

<MyRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   ...
  <ProductModelData>
    <ProductModelID>6</ProductModelID>
    <Name>HL Road Frame</Name>
    <ManuSteps xsi:nil="true" />
  </ProductModelData>
  <ProductModelData>
    <ProductModelID>7</ProductModelID>
    <Name>HL Touring Frame</Name>
    <ManuSteps>
      <MI:step ... </MI:step>
      <MI:step ...</MI:step>
       ...
    </ManuSteps>
  </ProductModelData>
</MyRoot>

H. 使用 WITH XMLNAMESPACES 加入命名空間

如需範例,請參閱<使用 WITH XMLNAMESPACES 來加入命名空間>。

請參閱

參考

使用 AUTO 模式
使用 EXPLICIT 模式
使用 FOR XML 建構 XML

概念

使用 WITH XMLNAMESPACES 來加入命名空間
使用 PATH 模式

其他資源

SELECT (Transact-SQL)

說明及資訊

取得 SQL Server 2005 協助