FOR 句 (Transact-SQL)

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

重要な注意事項重要

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 オプションがある場合、アプリケーションの中でテーブルを参照できます。

    注意

    <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 テーブルのデータにアクセスしようとした場合。

    • 外部結合ステートメントの内部に存在するテーブルに一意のインデックスが定義されている場合。

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

    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 値を無視しなければならない場合、正しくない結果が返されることがあります。

    注意

    一意のインデックスに含まれる列で 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 AUTO を TYPE オプションおよび XMLSCHEMA オプションと共に指定しています。TYPE オプションを指定しているため、結果セットはクライアントに xml 型として返されます。XMLSCHEMA オプションは、返される XML データにインライン XSD スキーマが含まれることを指定し、ELEMENTS オプションは、結果の XML が要素中心であることを指定します。

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