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 列が含まれる場合、テーブルに一意なインデックスがある場合、および SQL Server に送られる SELECT ステートメントの最後に FOR BROWSE オプションがある場合、アプリケーションの中でテーブルを参照できます。注 <lock_hint> HOLDLOCK は、FOR BROWSE オプションを含む SELECT ステートメントでは使用できません。
FOR BROWSE は、UNION 演算子によって結合された SELECT ステートメントでは使えません。
注 テーブルの一意なインデックス キー列が NULL 値を許容し、かつそのテーブルが外部結合の内部にある場合、そのインデックスはブラウズ モードではサポートされません。
ブラウズ モードを使用すると、SQL Server テーブルの行をスキャンし、テーブルのデータを 1 回に 1 行ずつ更新できます。 アプリケーションのブラウズ モードで SQL Server テーブルにアクセスするには、次の 2 つのオプションのいずれかを使用する必要があります。
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 データベースに tleft テーブルと tright テーブルを作成し、両方に c1 という単一列が含まれるようにします。 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 値が 2 つ格納されます。 したがって、結果セットではテーブルの NULL 値、および右外部結合ステートメントによって提供された NULL 値を区別できません。 結果セットの NULL 値を無視しなければならない場合、正しくない結果が返されることがあります。
注 一意のインデックスに含まれる列で NULL 値を使用できない場合は、結果セットの NULL 値がすべて右外部結合ステートメントによって提供されます。
XML
クエリの結果を XML ドキュメントとして返します。 RAW、AUTO、EXPLICIT のいずれかの XML モードを指定する必要があります。 XML データおよび SQL Server の詳細については、「FOR XML (SQL Server)」を参照してください。RAW [ ('ElementName') ]
クエリの結果を取得し、結果セット内の各行を、要素タグとして汎用識別子 <row /> が指定されている XML 要素に変換します。 必要に応じて、その行要素に名前を指定することもできます。 変換結果の XML 出力では、各行に対して生成された行要素として、指定した ElementName が使用されます。 詳細については、「FOR XML での RAW モードの使用」および「FOR XML での RAW モードの使用」を参照してください。AUTO
クエリの結果を単純な入れ子の XML ツリーで返します。 FROM 句に含まれる各テーブルは、そのうち少なくとも 1 つの列が SELECT 句の一覧に示され、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 ('') ) などの空文字列を指定すると、ラッパー要素は生成されません。 EXPLICIT ディレクティブを使用するよりも、PATH を使用した方が、クエリが単純になる場合があります。 詳細については、「FOR XML での PATH モードの使用」を参照してください。BINARY BASE64
クエリは、バイナリ データをバイナリ ベース 64 エンコード形式で返します。 RAW モードおよび EXPLICIT モードでバイナリ データを取得する場合は、このオプションを指定する必要があります。 AUTO モードの場合は、これは既定値です。TYPE
クエリは、結果を xml 型として返します。 詳細については、「FOR XML クエリの TYPE ディレクティブ」を参照してください。ROOT [ ('RootName') ]
単一のトップレベル要素を、結果として生成される XML に追加します。 必要に応じて、生成するルート要素名を指定することもできます。 オプションのルート名を指定しない場合は、既定の <root> 要素が追加されます。
使用例
次の例では、FOR XML AUTO を TYPE オプションおよび XMLSCHEMA オプションと共に指定しています。 TYPE オプションを指定しているため、結果セットはクライアントに xml 型として返されます。 XMLSCHEMA オプションは、返される XML データにインライン XSD スキーマが含まれることを指定し、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;