FOR 子句 (Transact-SQL)
FOR 子句用來指定 BROWSE 或 XML 選項。 BROWSE 和 XML 是互不相干的選項。
重要事項 |
---|
FOR XML 選項的 XMLDATA 指示詞已被取代。在 RAW 和 AUTO 模式的情況下,請使用 XSD 產生。EXPLICIT 模式中沒有 XMLDATA 指示詞的替代項目。未來的 Microsoft SQL Server 版本將移除這項功能。請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 |
適用於:SQL Server (SQL Server 2008 透過目前版本)、Windows Azure 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 資料表的資料。
已針對存在外部聯結陳述式內部的資料表定義唯一索引。
若要在瀏覽模式中重新產生此行為,請遵循下列步驟:
在 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 (SQL Server)>。RAW [ ('ElementName') ]
取得查詢結果,將結果集中的每個資料列轉換成 XML 元素,且用一般識別碼 <row /> 來作為元素標記。 您可以選擇性地指定資料列元素的名稱。 產生的 XML 輸出利用指定的 ElementName 來作為針對每個資料列而產生的資料列元素。 如需詳細資訊,請參閱<使用 FOR XML 的 RAW 模式>和<使用 FOR XML 的 RAW 模式>。AUTO
在簡單的巢狀 XML 樹狀結構中,傳回查詢結果。 在 SELECT 子句中至少列出一個資料行的 FROM 子句中的每份資料表,都會表示成一個 XML 元素。 SELECT 子句所列出的資料行會對應到適當的元素屬性。 如需詳細資訊,請參閱<搭配 FOR XML 使用 AUTO 模式>。EXPLICIT
指定明確定義產生的 XML 樹狀結構的形狀。 當使用這個模式時,必須依照特定方式來撰寫查詢,以便明確指定所需巢狀結構的其他相關資訊。 如需詳細資訊,請參閱<搭配 FOR XML 使用 EXPLICIT 模式>。XMLDATA
傳回內嵌 XDR 結構描述,但不在結果中加入根元素。 如果指定了 XMLDATA,就會將 XDR 結構描述附加至文件中。XMLSCHEMA [ ('TargetNameSpaceURI') ]
傳回內嵌 XSD 結構描述。 您可以在指定這個指示詞時,選擇性地指定目標命名空間 URI,這會在結構描述中傳回指定的命名空間。 如需詳細資訊,請參閱<產生內嵌 XSD 結構描述>。ELEMENTS
指定以子元素來傳回資料行。 否則,便將它們對應到 XML 屬性。 只有 RAW、AUTO 和 PATH 模式支援這個選項。 如需詳細資訊,請參閱<使用 FOR XML 的 RAW 模式>。XSINIL
指定針對 NULL 資料行值來建立 xsi:nil 屬性設成 True 的元素。 這個選項只能搭配 ELEMENTS 指示詞來指定。 如需詳細資訊,請參閱<使用 XSINIL 參數為 NULL 值產生元素>。ABSENT
指出對於 NULL 資料行值而言,不會在 XML 結果中加入對應的 XML 元素。 請只搭配 ELEMENTS 來指定這個選項。PATH [ ('ElementName') ]
針對結果集中的每個資料列來產生 <row> 元素包裝函數。 您可以選擇性地指定 <row> 元素包裝函數的元素名稱。 如果提供空字串,如 FOR XML PATH ('') ),就不會產生包裝函數元素。 使用 PATH 可能會針對利用 EXPLICIT 指示詞來撰寫的查詢提供較簡單的替代方案。 如需詳細資訊,請參閱<搭配 FOR XML 使用 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 AdventureWorks2012;
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;