共用方式為


SELECT - FOR 子句 (Transact-SQL)

適用於:sql Server Azure SQL 資料庫 Azure SQL 受控執行個體 Microsoft Fabric Microsoft Fabric SQL 資料庫中的 Microsoft 網狀架構倉儲中的 SQL 分析端點

您可以使用 FOR 子句來為查詢結果指定下列其中一個選項。

  • 藉由指定 FOR BROWSE,在流覽模式數據指標中檢視查詢結果時允許更新。

  • 藉由指定 FOR XML,將查詢結果格式化為 XML。

  • 藉由指定 FOR JSON,將查詢結果格式化為 JSON。

Transact-SQL 語法慣例

語法

[ FOR { BROWSE | <XML> | <JSON>} ]  

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

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

<JSON> ::=  
JSON   
{   
    { AUTO | PATH }   
    [   
        [ , ROOT [ ( 'RootName' ) ] ]  
        [ , INCLUDE_NULL_VALUES ]  
        [ , WITHOUT_ARRAY_WRAPPER ]  
    ]  

}

FOR BROWSE

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 資料庫中,建立 tleft 數據表和 tright 數據表,其中包含名為 c1的單一數據行。 定義 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 值都是由右外部聯接語句引進。

FOR XML

XML

指定查詢結果要以 XML 文件來傳回。 必須指定下列其中一種 XML 模式:RAWAUTOEXPLICIT。 如需 XML 資料和 SQL Server 的詳細資訊,請參閱 FOR XML (SQL Server)

RAW [ ('ElementName') ]

取得查詢結果,並將結果集中的每個數據列轉換成具有泛型標識碼的 XML 元素,<row /> 做為項目標記。 您可以選擇性地指定資料列元素的名稱。 產生的 XML 輸出會使用指定的 ElementName 作為針對每個數據列產生的數據列專案。 如需詳細資訊,請參閱 搭配 FOR XML 使用 RAW 模式

AUTO

將查詢結果以簡易巢狀 XML 樹狀結構傳回。 FROM 子句中的每個數據表,其中至少一個數據行列列在 SELECT 子句中,都會以 XML 元素表示。 SELECT 子句中列出的數據行會對應至適當的項目屬性。 如需詳細資訊,請參閱 搭配 FOR XML 使用 AUTO 模式

EXPLICIT

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

XMLDATA

傳回內嵌 XDR 結構描述,但不在結果中加入根元素。 如果指定 XMLDATA,XDR 架構會附加至檔。

重要

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

隱藏不想要的換行符: 您可以使用 SQL Server Management Studio (SSMS) 發出使用 FOR XML 子句的查詢。 有時會傳回大量 XML 並顯示在一個方格中。 XML 字串的長度可能會超過一個 SSMS 方格中單一行所能保存的長度。 在這些情況下,SSMS 可能會在整個 XML 字串的長區段之間插入分行符號字元。 這類分行符號可能出現在不應該分行的子字串中間。 您可以使用轉換 AS XMLDATA來防止換行符。 當您使用 FOR JSON PATH時,也可以套用此解決方案,如下列 Transact-SQL 範例 SELECT 語句所示:

SELECT CAST(
    (SELECT column1, column2
        FROM my_table
        FOR XML PATH('')
    )
        AS VARCHAR(MAX)
) AS XMLDATA ;

XMLSCHEMA [ ('TargetNameSpaceURI') ]

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

ELEMENTS

指定以子元素來傳回資料行。 否則這些資料行會對應到 XML 屬性。 只有 RAWAUTOPATH 模式才支援此選項。 如需詳細資訊,請參閱 搭配 FOR XML 使用 RAW 模式

XSINIL

指定針對 NULL 數據行值建立 xsi:nil 屬性設定為 True 的專案。 此選項只能使用 ELEMENTS 指示詞來指定。 如需詳細資訊,請參閱

ABSENT

表示針對 NULL 數據行值,將不會在 XML 結果中加入對應的 XML 元素。 請只搭配 ELEMENTS 來指定這個選項。

PATH [ ('ElementName') ]

為結果集中的每個數據列產生 <row> 項目包裝函式。 您可以選擇性地指定 <row> 項目包裝函式的元素名稱。 如果提供空字串,例如 FOR XML PATH ('') ),則不會產生包裝函式專案。 使用 PATH 可能會提供更簡單的替代方式,以使用 EXPLICIT 指示詞撰寫的查詢。 如需詳細資訊,請參閱 搭配 FOR XML 使用 PATH 模式

BINARY BASE64

指定查詢用二進位 Base64 編碼格式來傳回二進位資料。 當您使用 RAWEXPLICIT 模式擷取二進位數據時,必須指定此選項。 這是 AUTO 模式中的預設值。

TYPE

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

ROOT [ ('RootName') ]

指定將單一最上層元素加入產生的 XML 中。 您可以選擇性地指定要產生的根元素名稱。 如果未指定選擇性的根名稱,則會新增預設 <root> 專案。

如需詳細資訊,請參閱 FOR XML (SQL Server)

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

USE AdventureWorks2022;  
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;  

FOR JSON

言論

在網狀架構數據倉儲中,FOR JSON 必須是查詢中的最後一個運算符,因此不允許在子查詢內。

JSON

指定 FOR JSON 以將查詢結果以 JSON 文字格式傳回。 您還必須指定下列其中一個 JSON 模式:AUTO 或 PATH。 如需 FOR JSON 子句的詳細資訊,請參閱 使用 FOR JSON 將查詢結果格式化為 JSON

AUTO

藉由指定 FOR JSON AUTO,根據 SELECT 語句的結構自動格式化 JSON 輸出。 如需詳細資訊和範例,請參閱使用 AUTO 模式自動將 JSON 輸出格式化 (SQL Server)

PATH

藉由指定 FOR JSON PATH,以完全控制 JSON 輸出的格式。 PATH 模式可讓您建立包裝函式物件和巢狀複雜屬性。 如需詳細資訊和範例,請參閱使用 PATH 模式將巢狀 JSON 輸出格式化 (SQL Server)

INCLUDE_NULL_VALUES

使用 FOR JSON 子句指定 INCLUDE_NULL_VALUES 選項,以在 JSON 輸出中包含 NULL 值。 如果您未指定此選項,輸出就不會在查詢結果中包含 NULL 值的 JSON 屬性。 如需詳細資訊和範例,請參閱使用 INCLUDE_NULL_VALUES 選項在 JSON 輸出中包含 Null 值 (SQL Server)

ROOT [ ('RootName') ]

使用 FOR JSON 子句指定 ROOT 選項,將單一最上層元素新增至 JSON 輸出。 如果您未指定 ROOT 選項,JSON 輸出就不會有根元素。 如需詳細資訊和範例,請參閱使用 ROOT 選項將根節點新增至 JSON 輸出 (SQL Server)

WITHOUT_ARRAY_WRAPPER

使用 FOR JSON 子句指定 WITHOUT_ARRAY_WRAPPER 選項,以移除預設括住 JSON 輸出的方括弧。 如果您未指定此選項,JSON 輸出以方括號括住。 使用 [WITHOUT_ARRAY_WRAPPER] 選項來產生單一 JSON 對象作為輸出。 如需詳細資訊,請參閱使用 WITHOUT_ARRAY_WRAPPER 選項從 JSON 輸出移除方括弧 (SQL Server)

如需詳細資訊,請參閱使用 FOR JSON 將查詢結果格式化為 JSON (SQL Server)