FOR 子句 (Transact-SQL)
FOR 子句用來指定 BROWSE 或 XML 選項。BROWSE 和 XML 是互不相干的選項。
重要事項 |
---|
FOR XML 選項的 XMLDATA 指示詞已被取代。在 RAW 和 AUTO 模式的情況下,請使用 XSD 產生。EXPLICIT 模式中沒有 XMLDATA 指示詞的替代項目。未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 |
語法
[ 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 資料表的資料。
已針對存在外部聯結陳述式內部的資料表定義唯一索引。
若要在瀏覽模式中重新產生此行為,請遵循下列步驟:
在 SQL Server Management Studio 中,建立名為 SampleDB 的資料庫。
在 SampleDB 資料庫中,建立同時包含名為 c1 之單一資料行的 tleft 資料表和 tright 資料表。針對 tleft 資料表中的 c1 資料行定義唯一索引鍵,並且將此資料行設定為接受 Null 值。若要這樣做,請在適當的查詢視窗中執行下列 Transact-SQL 陳述式:
CREATE TABLE tleft(c1 INT NULL UNIQUE) ; GO CREATE TABLE tright(c1 INT NULL) ; GO
在 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
開啟 NO_BROWSETABLE 選項。若要這樣做,請在查詢視窗中執行下列 Transact-SQL 陳述式:
SET NO_BROWSETABLE ON ; GO
透過在 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 AdventureWorks;
GO
SELECT ContactID, FirstName, LastName, Phone
FROM Person.Contact
WHERE LastName LIKE 'G%'
ORDER BY LastName, FirstName
FOR XML AUTO, TYPE, XMLSCHEMA, ELEMENTS XSINIL;