FOR 子句 (Transact-SQL)

FOR 子句用來指定 BROWSE 或 XML 選項。BROWSE 和 XML 是互不相干的選項。

重要事項重要事項

FOR XML 選項的 XMLDATA 指示詞已被取代。在 RAW 和 AUTO 模式的情況下,請使用 XSD 產生。EXPLICIT 模式中沒有 XMLDATA 指示詞的替代項目。未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。

主題連結圖示Transact-SQL 語法慣例

語法

[ FOR { BROWSE | <XML> } ]
<XML> ::=
XML 
{ 
    { RAW [ ( 'ElementName' ) ] | AUTO } 
    [ 
        <CommonDirectives> 
        [ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ] 
        [ , ELEMENTS [ XSINIL | ABSENT ] 
    ]
  | EXPLICIT 
    [ 
        <CommonDirectives> 
        [ , XMLDATA ] 
    ]
  | PATH [ ( 'ElementName' ) ] 
    [
        <CommonDirectives> 
        [ , ELEMENTS [ XSINIL | ABSENT ] ]
    ]
} 

<CommonDirectives> ::= 
[ , BINARY BASE64 ]
[ , TYPE ]
[ , ROOT [ ( 'RootName' ) ] ]

引數

  • BROWSE
    指定允許在檢視 DB-Library 瀏覽模式資料指標中的資料時進行更新。如果資料表包括 timestamp 資料行、資料表有唯一索引,且 FOR BROWSE 選項在傳給 SQL Server 執行個體的 SELECT 陳述式結尾,便可以在應用程式中瀏覽資料表。

    [!附註]

    您不能在包括 FOR BROWSE 選項的 SELECT 陳述式中使用 <lock_hint> HOLDLOCK。

    FOR BROWSE 不能出現在 UNION 運算子所聯集的 SELECT 陳述式中。

    [!附註]

    當資料表的唯一索引鍵資料行可設為 Null 時,資料表是在外部聯結的內側,瀏覽模式並不支援索引。

    此瀏覽模式可讓您在 SQL Server 資料表中掃描資料列,並且更新資料表中的資料 (一次一個資料列)。若要以瀏覽模式在應用程式中存取 SQL Server 資料表,您必須使用下列其中一個選項:

    • 您用來從 SQL Server 資料表中存取資料的 SELECT 陳述式必須以關鍵字 FOR BROWSE 為結尾。當您開啟 FOR BROWSE 選項以便使用瀏覽模式時,系統就會建立暫存資料表。

    • 您必須使用 NO_BROWSETABLE 選項來執行下列 Transact-SQL 陳述式,才能開啟瀏覽模式:

      SET NO_BROWSETABLE ON
      

      當您開啟 NO_BROWSETABLE 選項時,所有 SELECT 陳述式的行為會如同 FOR BROWSE 選項已附加至這些陳述式。不過,NO_BROWSETABLE 選項不會建立 FOR BROWSE 選項通常用來將結果傳送給應用程式的暫存資料表。

    當您嘗試使用包含外部聯結陳述式的 SELECT 查詢,在瀏覽模式中存取 SQL Server 資料表的資料,而且已針對存在外部聯結陳述式內部的資料表定義唯一索引時,瀏覽模式就不支援此唯一索引。只有當所有唯一索引的索引鍵資料行都可以接受 Null 值時,瀏覽模式才會支援此唯一索引。如果下列條件成立,瀏覽模式就不支援此唯一索引:

    • 您嘗試使用包含外部聯結陳述式的 SELECT 查詢,在瀏覽模式中存取 SQL Server 資料表的資料。

    • 已針對存在外部聯結陳述式內部的資料表定義唯一索引。

    若要在瀏覽模式中重新產生此行為,請遵循下列步驟:

    1. 在 SQL Server Management Studio 中,建立名為 SampleDB 的資料庫。

    2. 在 SampleDB 資料庫中,建立同時包含名為 c1 之單一資料行的 tleft 資料表和 tright 資料表。針對 tleft 資料表中的 c1 資料行定義唯一索引鍵,並且將此資料行設定為接受 Null 值。若要這樣做,請在適當的查詢視窗中執行下列 Transact-SQL 陳述式:

      CREATE TABLE tleft(c1 INT NULL UNIQUE) ;
      GO 
      CREATE TABLE tright(c1 INT NULL) ;
      GO
      
    3. 在 tleft 資料表和 tright 資料表中插入多個值。請確定您在 tleft 資料表中插入一個 Null 值。若要這樣做,請在查詢視窗中執行下列 Transact-SQL 陳述式:

      INSERT INTO tleft VALUES(2) ;
      INSERT INTO tleft VALUES(NULL) ;
      INSERT INTO tright VALUES(1) ;
      INSERT INTO tright VALUES(3) ;
      INSERT INTO tright VALUES(NULL) ;
      GO
      
    4. 開啟 NO_BROWSETABLE 選項。若要這樣做,請在查詢視窗中執行下列 Transact-SQL 陳述式:

      SET NO_BROWSETABLE ON ;
      GO
      
    5. 透過在 SELECT 查詢中使用外部聯結陳述式,存取 tleft 資料表和 tright 資料表中的資料。請確定 tleft 資料表位於外部聯結陳述式的內部。若要這樣做,請在查詢視窗中執行下列 Transact-SQL 陳述式:

      SELECT tleft.c1 
      FROM tleft 
      RIGHT JOIN tright 
      ON tleft.c1 = tright.c1 
      WHERE tright.c1 <> 2 ;
      

      請在結果窗格中注意下列輸出:

      c1

      ----

      NULL

      NULL

    在您以瀏覽模式執行 SELECT 查詢來存取資料表之後,由於右方外部聯結陳述式的定義,所以 SELECT 查詢的結果集就會針對 tleft 資料表中的 c1 資料行包含兩個 Null 值。因此,在結果集中,您無法區別來自此資料表的 Null 值與右方外部聯結陳述式所導入的 Null 值。如果您必須忽略結果集的 Null 值,可能會收到不正確的結果。

    [!附註]

    如果唯一索引中包含的資料行不接受 Null 值,表示結果集中的所有 Null 值都是由右方外部聯結陳述式所導入。

  • XML
    指定查詢結果要以 XML 文件來傳回。您必須指定下列 XML 模式之一:RAW、AUTO、EXPLICIT。如需有關 XML 資料和 SQL Server 的詳細資訊,請參閱<使用 FOR XML 建構 XML>。

  • RAW [ ('ElementName') ]
    取得查詢結果,將結果集中的每個資料列轉換成 XML 元素,且用一般識別碼 <row /> 來作為元素標記。您可以選擇性地指定資料列元素的名稱。產生的 XML 輸出利用指定的 ElementName 來作為針對每個資料列而產生的資料列元素。如需詳細資訊,請參閱<使用 RAW 模式>和<使用 RAW 模式>。

  • AUTO
    在簡單的巢狀 XML 樹狀結構中,傳回查詢結果。在 SELECT 子句中至少列出一個資料行的 FROM 子句中的每份資料表,都會表示成一個 XML 元素。SELECT 子句所列出的資料行會對應到適當的元素屬性。如需詳細資訊,請參閱<使用 AUTO 模式>。

  • EXPLICIT
    指定明確定義產生的 XML 樹狀結構的形狀。當使用這個模式時,必須依照特定方式來撰寫查詢,以便明確指定所需巢狀結構的其他相關資訊。如需詳細資訊,請參閱<使用 EXPLICIT 模式>。

  • XMLDATA
    傳回內嵌 XDR 結構描述,但不在結果中加入根元素。如果指定了 XMLDATA,就會將 XDR 結構描述附加至文件中。

  • XMLSCHEMA [ ('TargetNameSpaceURI') ]
    傳回內嵌 XSD 結構描述。您可以在指定這個指示詞時,選擇性地指定目標命名空間 URI,這會在結構描述中傳回指定的命名空間。如需詳細資訊,請參閱<內嵌 XSD 結構描述的產生>。

  • ELEMENTS
    指定以子元素來傳回資料行。否則,便將它們對應到 XML 屬性。只有 RAW、AUTO 和 PATH 模式支援這個選項。如需詳細資訊,請參閱<使用 RAW 模式>。

  • XSINIL
    指定針對 NULL 資料行值來建立 xsi:nil 屬性設成 True 的元素。這個選項只能搭配 ELEMENTS 指示詞來指定。如需詳細資訊,請參閱<使用 XSINIL 參數為 NULL 值產生元素>。

  • ABSENT
    指出對於 NULL 資料行值而言,不會在 XML 結果中加入對應的 XML 元素。請只搭配 ELEMENTS 來指定這個選項。

  • PATH [ ('ElementName') ]
    針對結果集中的每個資料列來產生 <row> 元素包裝函式。您可以選擇性地指定 <row> 元素包裝函式的元素名稱。如果提供空字串,如 FOR XML PATH ('') ),就不會產生包裝函式元素。使用 PATH 可能會針對利用 EXPLICIT 指示詞來撰寫的查詢提供較簡單的替代方案。如需詳細資訊,請參閱<使用 PATH 模式>。

  • BINARY BASE64
    指定查詢用二進位 Base64 編碼格式來傳回二進位資料。當您利用 RAW 和 EXPLICIT 模式來擷取二進位資料時,您必須指定這個選項。這是 AUTO 模式的預設值。

  • TYPE
    指定查詢傳回 xml 類型的結果。如需詳細資訊,請參閱<在 FOR XML 查詢中的 TYPE 指示詞>。

  • ROOT [ ('RootName') ]
    指定將單一最上層元素加入產生的 XML 中。您可以選擇性地指定要產生的根元素名稱。如果未指定選擇性的根名稱,就會加入預設 <root> 元素。

範例

下列範例指定設定了 TYPE 和 XMLSCHEMA 選項的 FOR XML AUTO。由於 TYPE 選項,結果集會以 xml 類型傳回用戶端。XMLSCHEMA 選項指定將內嵌 XSD 結構描述包括在傳回的 XML 資料中,ELEMENTS 選項指定 XML 結果以元素為中心。

USE AdventureWorks2008R2;
GO
SELECT p.BusinessEntityID, FirstName, LastName, PhoneNumber AS Phone
FROM Person.Person AS p
Join Person.PersonPhone AS pph ON p.BusinessEntityID  = pph.BusinessEntityID
WHERE LastName LIKE 'G%'
ORDER BY LastName, FirstName 
FOR XML AUTO, TYPE, XMLSCHEMA, ELEMENTS XSINIL;