SELECT - FOR 句 (Transact-SQL)SELECT - FOR Clause (Transact-SQL)

適用対象:○SQL Server (2008 以降)○Azure SQL Database×Azure SQL Data Warehouse ×Parallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

FOR 句を使用し、クエリ結果に次のいずれかのオプションを指定します。Use the FOR clause to specify one of the following options for query results.

  • [FOR BROWSE] を指定し、ブラウズ モード カーソルでクエリ結果を表示している間、更新を許可します。Allow updates while viewing query results in a browse mode cursor by specifying FOR BROWSE.

  • [FOR XML] を指定し、XML としてクエリ結果を書式設定します。Format query results as XML by specifying FOR XML.

  • [FOR JSON] を指定し、JSON としてクエリ結果を書式設定します。Format query results as JSON by specifying FOR JSON.

    トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax


[ FOR { BROWSE | <XML> | <JSON>} ]  

<XML> ::=  
XML   
{   
    { RAW [ ( 'ElementName' ) ] | AUTO }   
    [   
        <CommonDirectivesForXML>   
        [ , { XMLDATA | XMLSCHEMA [ ( 'TargetNameSpaceURI' ) ] } ]   
        [ , ELEMENTS [ XSINIL | ABSENT ]   
    ]  
  | EXPLICIT   
    [   
        <CommonDirectivesForXML>   
        [ , XMLDATA ]   
    ]  
  | PATH [ ( 'ElementName' ) ]   
    [  
        <CommonDirectivesForXML>   
        [ , ELEMENTS [ XSINIL | ABSENT ] ]  
    ]  
}   

<CommonDirectivesForXML> ::=   
[ , BINARY BASE64 ]  
[ , TYPE ]  
[ , ROOT [ ( 'RootName' ) ] ]  

<JSON> ::=  
JSON   
{   
    { AUTO | PATH }   
    [   
        [ , ROOT [ ( 'RootName' ) ] ]  
        [ , INCLUDE_NULL_VALUES ]  
        [ , WITHOUT_ARRAY_WRAPPER ]  
    ]  

}  

FOR BROWSEFOR BROWSE

BROWSEBROWSE
DB-Library ブラウズ モード カーソルでデータを表示しているときに、更新が許可されます。Specifies that updates be allowed while viewing the data in a DB-Library browse mode cursor. テーブルに timestamp 列が含まれる場合、テーブルに一意なインデックスがある場合、 SQL ServerSQL Server に送られる SELECT ステートメントの最後に FOR BROWSE オプションがある場合、アプリケーションの中でテーブルを参照できます。A table can be browsed in an application if the table includes a timestamp column, the table has a unique index, and the FOR BROWSE option is at the end of the SELECT statements sent to an instance of SQL ServerSQL Server.

注意

<lock_hint> HOLDLOCK は、FOR BROWSE オプションを含む SELECT ステートメントでは使用できません。You cannot use the <lock_hint> HOLDLOCK in a SELECT statement that includes the FOR BROWSE option.

FOR BROWSE は、UNION 演算子によって結合された SELECT ステートメントでは使えません。FOR BROWSE cannot appear in SELECT statements that are joined by the UNION operator.

注意

テーブルの一意なインデックス キー列が NULL 値を許容し、かつそのテーブルが外部結合の内部にある場合、そのインデックスはブラウズ モードではサポートされません。When the unique index key columns of a table are nullable, and the table is on the inner side of an outer join, the index is not supported by browse mode.

ブラウズ モードを使用すると、 SQL ServerSQL Server テーブルの行をスキャンし、テーブルのデータを 1 回に 1 行ずつ更新できます。The browse mode lets you scan the rows in your SQL ServerSQL Server table and update the data in your table one row at a time. アプリケーションのブラウズ モードで SQL ServerSQL Server テーブルにアクセスするには、次の 2 つのオプションのいずれかを使用する必要があります。To access a SQL ServerSQL Server table in your application in the browse mode, you must use one of the following two options:

  • SQL ServerSQL Server テーブルのデータにアクセスするために使用する SELECT ステートメントは FOR BROWSE キーワードで終了する必要があります。The SELECT statement that you use to access the data from your SQL ServerSQL Server table must end with the keywords FOR BROWSE. FOR BROWSE オプションをオンにしてブラウズ モードを使用すると、一時テーブルが作成されます。When you turn on the FOR BROWSE option to use browse mode, temporary tables are created.

  • NO_BROWSETABLE オプションを使用してブラウズ モードをオンにするには、次の Transact-SQLTransact-SQL ステートメントを実行する必要があります。You must run the following Transact-SQLTransact-SQL statement to turn on the browse mode by using the NO_BROWSETABLE option:

    SET NO_BROWSETABLE ON  
    

    NO_BROWSETABLE オプションをオンにすると、すべての SELECT ステートメントは FOR BROWSE オプションがステートメントに追加されたかのように動作します。When you turn on the NO_BROWSETABLE option, all the SELECT statements behave as if the FOR BROWSE option is appended to the statements. ただし、NO_BROWSETABLE オプションでは、FOR BROWSE オプションが通常結果をアプリケーションに送信する際に使用する一時テーブルが作成されません。However, the NO_BROWSETABLE option does not create the temporary tables that the FOR BROWSE option generally uses to send the results to your application.

    外部結合ステートメントが関与する SELECT クエリを使用してブラウズ モードで SQL ServerSQL Server テーブルのデータにアクセスしようとしたときに、外部結合ステートメントの内部のテーブルに一意のインデックスが定義されている場合、この一意のインデックスはブラウズ モードでサポートされません。When you try to access the data from SQL ServerSQL Server tables in browse mode by using a SELECT query that involves an outer join statement, and when a unique index is defined on the table that is present on the inner side of an outer join statement, the browse mode does not support the unique index. ブラウズ モードで一意のインデックスがサポートされるのは、すべての一意のインデックス キー列が NULL 値を使用できる場合のみです。The browse mode supports the unique index only when all the unique index key columns can accept null values. 次の条件に当てはまる場合は、ブラウズ モードで一意のインデックスがサポートされません。The browse mode does not support the unique index if the following conditions are true:

  • 外部結合ステートメントを含む SELECT クエリを使用して、ブラウズ モードで SQL ServerSQL Server テーブルのデータにアクセスしようとした場合。You try to access the data from SQL ServerSQL Server tables in browse mode by using a SELECT query that involves an outer join statement.

  • 外部結合ステートメントの内部に存在するテーブルに一意のインデックスが定義されている場合。A unique index is defined on the table that is present on the inner side of an outer join statement.

    ブラウズ モードでこの動作を再現するには、以下の手順を実行します。To reproduce this behavior in the browse mode, follow these steps:

  1. [SQL Server Management Studio]SQL Server Management Studio で、SampleDB という名前のデータベースを作成します。In [SQL Server Management Studio]SQL Server Management Studio, create a database, named SampleDB.

  2. SampleDB データベースに tleft テーブルと tright テーブルを作成し、両方に c1 という単一列が含まれるようにします。In the SampleDB database, create a tleft table and a tright table that both contain a single column that is named c1. tleft テーブルの c1 列に一意のインデックスを定義し、この列が NULL 値を許容するように設定します。Define a unique index on the c1 column in the tleft table, and set the column to accept null values. このためには、適切なクエリ ウィンドウで次の Transact-SQLTransact-SQL ステートメントを実行します。To do this, run the following Transact-SQLTransact-SQL statements in an appropriate query window:

    CREATE TABLE tleft(c1 INT NULL UNIQUE) ;  
    GO   
    CREATE TABLE tright(c1 INT NULL) ;  
    GO  
    
  3. tleft テーブルと tright テーブルに複数の値を挿入します。Insert several values in the tleft table and the tright table. tleft テーブルに NULL 値を挿入します。Make sure that you insert a null value in the tleft table. このためには、クエリ ウィンドウで次の Transact-SQLTransact-SQL ステートメントを実行します。To do this, run the following Transact-SQLTransact-SQL statements in the query window:

    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 オプションをオンにします。Turn on the NO_BROWSETABLE option. このためには、クエリ ウィンドウで次の Transact-SQLTransact-SQL ステートメントを実行します。To do this, run the following Transact-SQLTransact-SQL statements in the query window:

    SET NO_BROWSETABLE ON ;  
    GO  
    
  5. SELECT クエリで外部結合ステートメントを使用して、tleft テーブルと tright テーブルのデータにアクセスします。Access the data in the tleft table and the tright table by using an outer join statement in the SELECT query. tleft テーブルが外部結合ステートメントの内部に存在することを確認します。Make sure that the tleft table is on the inner side of the outer join statement. このためには、クエリ ウィンドウで次の Transact-SQLTransact-SQL ステートメントを実行します。To do this, run the following Transact-SQLTransact-SQL statements in the query window:

    SELECT tleft.c1   
    FROM tleft   
    RIGHT JOIN tright   
    ON tleft.c1 = tright.c1   
    WHERE tright.c1 <> 2 ;  
    

    [結果] ペインに、次の出力が表示されます。Notice the following output in the Results pane:

    c1c1

    ----

    NULLNULL

    NULLNULL

    ブラウズ モードで SELECT クエリを実行してテーブルにアクセスすると、右外部結合ステートメントの定義に従い、SELECT クエリの結果セットに tleft テーブルの c1 列の NULL 値が 2 つ格納されます。After you run the SELECT query to access the tables in the browse mode, the result set of the SELECT query contains two null values for the c1 column in the tleft table because of the definition of the right outer join statement. したがって、結果セットではテーブルの NULL 値、および右外部結合ステートメントによって提供された NULL 値を区別できません。Therefore, in the result set, you cannot distinguish between the null values that came from the table and the null values that the right outer join statement introduced. 結果セットの NULL 値を無視しなければならない場合、正しくない結果が返されることがあります。You might receive incorrect results if you must ignore the null values from the result set.

注意

一意のインデックスに含まれる列で NULL 値を使用できない場合は、結果セットの NULL 値がすべて右外部結合ステートメントによって提供されます。If the columns that are included in the unique index do not accept null values, all the null values in the result set were introduced by the right outer join statement.

FOR XMLFOR XML

XMLXML
クエリの結果を XML ドキュメントとして返します。Specifies that the results of a query are to be returned as an XML document. XML モードとして、RAW、AUTO、EXPLICIT のいずれか 1 つを指定する必要があります。One of the following XML modes must be specified: RAW, AUTO, EXPLICIT. XML データと SQL ServerSQL Server の詳細については、「FOR XML (SQL Server)」を参照してください。For more information about XML data and SQL ServerSQL Server, see FOR XML (SQL Server).

RAW [ ('ElementName') ]RAW [ ('ElementName') ]
クエリの結果を取得し、結果セット内の各行を、要素タグとして汎用識別子 <row /> が指定されている XML 要素に変換します。Takes the query result and transforms each row in the result set into an XML element with a generic identifier <row /> as the element tag. 必要に応じて、その行要素に名前を指定することもできます。You can optionally specify a name for the row element. 結果の XML 出力では、指定した ElementName が、行ごとに生成される行要素として使用されます。The resulting XML output uses the specified ElementName as the row element generated for each row. 詳細については、「 FOR XML での RAW モードの使用」を参照してください。For more information, see Use RAW Mode with FOR XML.

AUTOAUTO
クエリの結果を単純な入れ子の XML ツリーで返します。Returns query results in a simple, nested XML tree. FROM 句に含まれる各テーブルは、そのうち少なくとも 1 つの列が SELECT 句の一覧に示され、XML 要素として表されます。Each table in the FROM clause, for which at least one column is listed in the SELECT clause, is represented as an XML element. SELECT 句に一覧されている列は、該当する要素属性にマップされます。The columns listed in the SELECT clause are mapped to the appropriate element attributes. 詳細については、「 FOR XML での AUTO モードの使用」を参照してください。For more information, see Use AUTO Mode with FOR XML.

EXPLICITEXPLICIT
結果として得られる XML ツリーの形状を明示的に定義することを指定します。Specifies that the shape of the resulting XML tree is defined explicitly. このモードを使用する場合は、目的の入れ子に関する追加の情報を明示的に指定できるように、クエリを特別な方法で記述する必要があります。Using this mode, queries must be written in a particular way so that additional information about the desired nesting is specified explicitly. 詳細については、「 FOR XML での EXPLICIT モードの使用」を参照してください。For more information, see Use EXPLICIT Mode with FOR XML.

XMLDATAXMLDATA
インライン XDR スキーマを返します。ただし、結果にルート要素は追加されません。Returns inline XDR schema, but does not add the root element to the result. XMLDATA を指定すると、XDR スキーマはドキュメントに追加されます。If XMLDATA is specified, XDR schema is appended to the document.

重要

XMLDATA ディレクティブは非推奨とされます。The XMLDATA directive is deprecated. RAW モードと AUTO モードの場合は、XSD 世代を使用してください。Use XSD generation in the case of RAW and AUTO modes. EXPLICIT モードでは、XMLDATA ディレクティブに代わる機能はありません。There is no replacement for the XMLDATA directive in EXPLICIT mode. この機能はメンテナンス モードであり、Microsoft SQL Server の将来のバージョンで削除される可能性があります。This feature is in maintenance mode and may be removed in a future version of Microsoft SQL Server. 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。Avoid using this feature in new development work, and plan to modify applications that currently use this feature.

XMLSCHEMA [ ('TargetNameSpaceURI') ]XMLSCHEMA [ ('TargetNameSpaceURI') ]
インライン XSD スキーマを返します。Returns inline XSD schema. このディレクティブを指定する場合は、必要に応じて、対象名前空間の URI を指定することもできます。指定した場合は、スキーマにある指定した名前空間が返されます。You can optionally specify a target namespace URI when you specify this directive, which returns the specified namespace in the schema. 詳細については、「 Generate an Inline XSD Schema」を参照してください。For more information, see Generate an Inline XSD Schema.

ELEMENTSELEMENTS
列を副要素として返します。Specifies that the columns are returned as subelements. 指定していない場合は、XML 属性にマップされます。Otherwise, they are mapped to XML attributes. このオプションは、RAW、AUTO、および PATH モードでのみサポートされます。This option is supported in RAW, AUTO and PATH modes only. 詳細については、「 FOR XML での RAW モードの使用」を参照してください。For more information, see Use RAW Mode with FOR XML.

XSINILXSINIL
列の値が NULL の場合、xsi:nil 属性が True に設定されている要素を作成します。Specifies that an element with xsi:nil attribute set to True be created for NULL column values. このオプションは、ELEMENTS ディレクティブでのみ指定できます。This option can only be specified with ELEMENTS directive. 詳細については、「XSINIL パラメーターを使用した NULL 値に対する要素の生成」を参照してください。For more information, see Generate Elements for NULL Values with the XSINIL Parameter.

ABSENTABSENT
列の値が NULL の場合、対応する XML 要素を XML 結果に追加しません。Indicates that for null column values, corresponding XML elements will not be added in the XML result. このオプションは、ELEMENTS でのみ指定してください。Specify this option only with ELEMENTS.

PATH [ ('ElementName') ]PATH [ ('ElementName') ]
結果セットの各行に対して <row> 要素ラッパーを生成します。Generates a <row> element wrapper for each row in the result set. 必要に応じて、<row> 要素ラッパーに要素名を指定することもできます。You can optionally specify an element name for the <row> element wrapper. FOR XML PATH ('') ) などの空文字列を指定すると、ラッパー要素は生成されません。If an empty string is provided, such as FOR XML PATH ('') ), a wrapper element is not generated. EXPLICIT ディレクティブを使用するよりも、PATH を使用した方が、クエリが単純になる場合があります。Using PATH may provide a simpler alternative to queries written using the EXPLICIT directive. 詳細については、「 FOR XML での PATH モードの使用」を参照してください。For more information, see Use PATH Mode with FOR XML.

BINARY BASE64BINARY BASE64
クエリは、バイナリ データをバイナリ ベース 64 エンコード形式で返します。Specifies that the query returns the binary data in binary base64-encoded format. RAW モードおよび EXPLICIT モードでバイナリ データを取得する場合は、このオプションを指定する必要があります。When you retrieve binary data by using RAW and EXPLICIT mode, this option must be specified. AUTO モードの場合は、これは既定値です。This is the default in AUTO mode.

TYPETYPE
クエリが結果を xml 型で返すことを指定します。Specifies that the query returns results as xml type. 詳細については、「 FOR XML クエリの TYPE ディレクティブ」を参照してください。For more information, see TYPE Directive in FOR XML Queries.

ROOT [ ('RootName') ]ROOT [ ('RootName') ]
単一のトップレベル要素を、結果として生成される XML に追加します。Specifies that a single top-level element be added to the resulting XML. 必要に応じて、生成するルート要素名を指定することもできます。You can optionally specify the root element name to generate. オプションのルート名を指定しない場合は、既定の <root> 要素が追加されます。If the optional root name is not specified, the default <root> element is added.

詳細については、「FOR XML (SQL Server)」を参照してください。For more info, see FOR XML (SQL Server).

FOR XML の例FOR XML Example

次の例では、FOR XML AUTOTYPE オプションおよび XMLSCHEMA オプションと共に指定しています。The following example specifies FOR XML AUTO with the TYPE and XMLSCHEMA options. TYPE オプションを指定しているため、結果セットはクライアントに xml 型として返されます。Because of the TYPE option, the result set is returned to the client as an xml type. XMLSCHEMA オプションは、返される XML データにインライン XSD スキーマが含まれることを指定し、ELEMENTS オプションは、結果の XML が要素中心であることを指定します。The XMLSCHEMA option specifies that the inline XSD schema is included in the XML data returned, and the ELEMENTS option specifies that the XML result is element-centric.

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;  

JSON のFOR JSON

JSONJSON
FOR JSON を指定し、JSON テキストとして書式設定されたクエリ結果を返します。Specify FOR JSON to return the results of a query formatted as JSON text. JSON モードとして自動またはパスも指定する必要があります。You also have to specify one of the following JSON modes : AUTO or PATH. FOR JSON 句の詳細については、「FOR JSON を使用してクエリ結果を JSON として書式設定する (SQL Server)」を参照してください。For more information about the FOR JSON clause, see Format Query Results as JSON with FOR JSON (SQL Server).

AUTOAUTO
FOR JSON AUTO を指定すると、Format the JSON output automatically based on the structure of the SELECT statement
SELECT ステートメントの構造に基づいて JSON 出力を自動的に書式設定します。by specifying FOR JSON AUTO. 詳細と例については、「AUTO モードで自動的に JSON 出力を書式設定する (SQL Server)」を参照してください。For more info and examples, see Format JSON Output Automatically with AUTO Mode (SQL Server).

PATHPATH
JSON 出力の書式設定をGet full control over the format of the JSON output by specifying
FOR JSON PATH を指定して完全制御します。FOR JSON PATH. PATH モードでは、ラッパー オブジェクトを作成し、複雑なプロパティを入れ子にすることができます。PATH mode lets you create wrapper objects and nest complex properties. 詳細と例については、「PATH モードで入れ子になった JSON 出力を書式設定する (SQL Server)」を参照してください。For more info and examples, see Format Nested JSON Output with PATH Mode (SQL Server).

INCLUDE_NULL_VALUESINCLUDE_NULL_VALUES
INCLUDE_NULL_VALUES オプションと FOR JSON 句を指定し、JSON 出力に NULL 値を含めます。Include null values in the JSON output by specifying the INCLUDE_NULL_VALUES option with the FOR JSON clause. このオプションを指定しない場合、出力では、クエリ結果の NULL 値に対する JSON のプロパティは含まれません。If you don't specify this option, the output does not include JSON properties for null values in the query results. 詳細については、「INCLUDE_NULL_VALUES オプションを使用して JSON の出力に Null 値を含める (SQL Server)」を参照してください。For more info and examples, see Include Null Values in JSON Output with the INCLUDE_NULL_VALUES Option (SQL Server).

ROOT [ ('RootName') ]ROOT [ ('RootName') ]
ROOT オプションと FOR JSON 句を指定し、最上位要素を 1 つ JSON 出力に追加します。Add a single, top-level element to the JSON output by specifying the ROOT option with the FOR JSON clause. 指定しない場合、 ROOT オプションでは、JSON の出力はルート要素がないです。If you don't specify the ROOT option, the JSON output doesn't have a root element. 詳細と例については、「ROOT オプションを使用して JSON 出力にルート ノードを追加する (SQL Server)」を参照してください。For more info and examples, see Add a Root Node to JSON Output with the ROOT Option (SQL Server).

WITHOUT_ARRAY_WRAPPERWITHOUT_ARRAY_WRAPPER
WITHOUT_ARRAY_WRAPPER オプションと FOR JSON 句を指定すると、JSON 出力を囲んでいる角かっこが既定で削除されます。Remove the square brackets that surround the JSON output by default by specifying the WITHOUT_ARRAY_WRAPPER option with the FOR JSON clause. このオプションを指定しないと、JSON 出力が角かっこで囲まれます。If you don't specify this option, the JSON output is enclosed within square brackets. WITHOUT_ARRAY_WRAPPER オプションを使用すると、単一の JSON オブジェクトを出力として生成できます。Use the WITHOUT_ARRAY_WRAPPER option to generate a single JSON object as output. 詳細については、「 WITHOUT_ARRAY_WRAPPER オプションを使用して JSON 出力から角かっこを削除する (SQL Server)For more info, see Remove Square Brackets from JSON Output with the WITHOUT_ARRAY_WRAPPER Option (SQL Server).

詳細については、「FOR JSON を使用してクエリ結果を JSON として書式設定する (SQL Server)」を参照してください。For more info, see Format Query Results as JSON with FOR JSON (SQL Server).

参照See Also

SELECT (Transact-SQL)SELECT (Transact-SQL)