Transact-SQL リファレンス


SQL Server 2008 オンライン ブック (2009 年 7 月)
FOR 句 (Transact-SQL)

FOR 句は、BROWSE オプションまたは XML オプションを指定するときに使用します。BROWSE オプションと XML オプションには、関連性はありません。

ms173812.note(ja-jp,SQL.100).gif重要 :
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 列が含まれる場合、テーブルに一意なインデックスがある場合、および SQL Server に送られる SELECT ステートメントの最後に FOR BROWSE オプションがある場合、アプリケーションの中でテーブルを参照できます。

ms173812.note(ja-jp,SQL.100).gifメモ :
<lock_hint> HOLDLOCK は、FOR BROWSE オプションを含む SELECT ステートメントでは使えません。

FOR BROWSE は、UNION 演算子によって結合された SELECT ステートメントでは使えません。

ms173812.note(ja-jp,SQL.100).gifメモ :
テーブルの一意なインデックス キー列が 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 テーブルのデータにアクセスしようとした場合。
  • 外部結合ステートメントの内部に存在するテーブルに一意のインデックスが定義されている場合。

ブラウズ モードでこの動作を再現するには、以下の手順を実行します。

  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 値が 2 つ格納されます。したがって、結果セットではテーブルの NULL 値、および右外部結合ステートメントによって提供された NULL 値を区別できません。結果セットの NULL 値を無視しなければならない場合、正しくない結果が返されることがあります。

ms173812.note(ja-jp,SQL.100).gifメモ :
一意のインデックスに含まれる列で NULL 値を使用できない場合は、結果セットの NULL 値がすべて右外部結合ステートメントによって提供されます。

XML

クエリの結果を XML ドキュメントとして返します。RAW、AUTO、EXPLICIT のいずれかの XML モードを指定する必要があります。XML データおよび SQL Server の詳細については、「FOR XML を使用した XML の構築」を参照してください。

RAW [ ('ElementName') ]

クエリの結果を取得し、結果セット内の各行を、要素タグとして汎用識別子 <row /> が指定されている XML 要素に変換します。必要に応じて、その行要素に名前を指定することもできます。変換結果の XML 出力では、各行に対して生成された行要素として、指定した ElementName が使用されます。詳細については、「RAW モードの使用」および「RAW モードの使用」を参照してください。

AUTO

クエリの結果を単純な入れ子の XML ツリーで返します。FROM 句に含まれる各テーブルは、そのうち少なくとも 1 つの列が SELECT 句の一覧に示され、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 ('') ) などの空文字列を指定すると、ラッパー要素は生成されません。EXPLICIT ディレクティブを使用するよりも、PATH を使用した方が、クエリが単純になる場合があります。詳細については、「PATH モードの使用」を参照してください。

BINARY BASE64

クエリは、バイナリ データをバイナリ ベース 64 エンコード形式で返します。RAW モードおよび EXPLICIT モードでバイナリ データを取得する場合は、このオプションを指定する必要があります。AUTO モードの場合は、これは既定値です。

TYPE

クエリは、結果を xml 型として返します。詳細については、「FOR XML クエリの TYPE ディレクティブ」を参照してください。

ROOT [ ('RootName') ]

単一のトップレベル要素を、結果として生成される XML に追加します。必要に応じて、生成するルート要素名を指定することもできます。オプションのルート名を指定しない場合は、既定の <root> 要素が追加されます。


次の例では、FOR XML AUTOTYPE オプションおよび XMLSCHEMA オプションと共に指定しています。TYPE オプションを指定しているため、結果セットはクライアントに xml 型として返されます。XMLSCHEMA オプションは、返される XML データにインライン XSD スキーマが含まれることを指定し、ELEMENTS オプションは、結果の XML が要素中心であることを指定します。

参照

関連項目

SELECT (Transact-SQL)

その他の技術情報

FOR XML を使用した XML の構築

ヘルプおよび情報

SQL Server 2008 の参考資料の入手
タグ :


Page view tracker