次の方法で共有


SELECT - FOR 句 (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス Microsoft Fabric のSQL データベース

FOR 句を使用し、クエリ結果に次のいずれかのオプションを指定します。

  • FOR BROWSEを指定して、参照モードカーソルでクエリ結果を表示しているときに更新を許可します。

  • FOR XMLを指定して、クエリ結果を XML として書式設定します。

  • FOR JSONを指定して、クエリ結果を JSON として書式設定します。

Transact-SQL 構文表記規則

構文

[ 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 BROWSE

BROWSE

DB-Library ブラウズ モード カーソルでデータを表示しているときに、更新が許可されます。 テーブルに timestamp 列が含まれる場合、テーブルに一意なインデックスがある場合、SQL Server に送られる SELECT ステートメントの最後に FOR BROWSE オプションがある場合、アプリケーションの中でテーブルを参照できます。

Note

FOR BROWSE オプションを含む SELECT ステートメントでは、<lock_hint> HOLDLOCK を使用することができません。

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

Note

テーブルの一意なインデックス キー列が 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 テーブルと、c1という名前の単一の列を含む tright テーブルを作成します。 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 テーブルが外部 join ステートメントの内側にあることを確認します。 これを実行するには、クエリ ウィンドウで次の 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 列の 2 つの NULL 値が含まれます。 したがって、結果セットでは、テーブルから取得された NULL 値と、右外部結合ステートメントによって導入された NULL 値を区別できません。 結果セットの NULL 値を無視する必要がある場合は、正しくない結果が表示されることがあります。

Note

一意のインデックスに含まれる列が NULL 値を受け入れられない場合、結果セット内のすべての NULL 値が右外部結合ステートメントによって導入されました。

FOR XML

XML

クエリの結果を XML ドキュメントとして返します。 次のいずれかの XML モードを指定する必要があります。RAWAUTOEXPLICIT。 XML データと SQL Server の詳細については、「FOR XML (SQL Server)」を参照してください。

RAW [ ('ElementName') ]

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

AUTO

クエリの結果を単純な入れ子の XML ツリーで返します。 SELECT 句に少なくとも 1 つの列がリストされている、FROM 句の各テーブルは XML 要素として表されます。 SELECT 句に示されている列は、適切な要素属性にマップされます。 詳細については、「 FOR XML での AUTO モードの使用」を参照してください。

EXPLICIT

結果として得られる XML ツリーの形状を明示的に定義することを指定します。 このモードを使用する場合は、目的の入れ子に関する追加の情報を明示的に指定できるように、クエリを特別な方法で記述する必要があります。 詳細については、「 FOR XML での EXPLICIT モードの使用」を参照してください。

XMLDATA

インライン XDR スキーマを返します。ただし、結果にルート要素は追加されません。 XMLDATA を指定すると、XDR スキーマがドキュメントに追加されます。

重要

XMLDATA ディレクティブ 非推奨のです。 RAW モードと AUTO モードの場合は、XSD 世代を使用してください。 EXPLICIT モードでは、XMLDATA ディレクティブに代わるものはありません。 この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。

不要な改行を抑制する: SQL Server Management Studio (SSMS) を使用して、FOR XML 句を使用するクエリを発行できます。 大量の XML が返され、1 つのグリッド セルに表示されることがあります。 XML 文字列は、1 つの SSMS グリッド セルで 1 行に保持できる長さを超えることがあります。 このような場合、SSMS では、XML 文字列全体の長いセグメントの間に改行文字が挿入されることがあります。 行をまたいで分割するべきではない部分文字列の真ん中でそのような改行が発生することがあります。 キャスト AS XMLDATAを使用すると、改行を防ぐことができます。 このソリューションは、次の Transact-SQL サンプル SELECT ステートメントのように、FOR JSON PATHを使用する場合にも適用できます。

SELECT CAST(
    (SELECT column1, column2
        FROM my_table
        FOR XML PATH('')
    )
        AS VARCHAR(MAX)
) AS XMLDATA ;

XMLSCHEMA [ ('TargetNameSpaceURI') ]

インライン XSD スキーマを返します。 このディレクティブを指定する場合は、必要に応じて、対象名前空間の URI を指定することもできます。指定した場合は、スキーマにある指定した名前空間が返されます。 詳細については、「 Generate an Inline XSD Schema」を参照してください。

ELEMENTS

列を副要素として返します。 指定していない場合は、XML 属性にマップされます。 このオプションは、RAWAUTO、および PATH モードでのみサポートされます。 詳細については、「 FOR XML での RAW モードの使用」を参照してください。

XSINIL

xsi:nil 属性が True に設定された要素NULL 列の値に対して作成されるように指定します。 このオプションは、ELEMENTS ディレクティブでのみ指定できます。 詳細については、次を参照してください。

ABSENT

NULL 列の値に対して、対応する XML 要素が XML 結果に追加されないことを示します。 このオプションは、ELEMENTS でのみ指定してください。

PATH [ ('ElementName') ]

結果セット内の各行の <row> 要素ラッパーを生成します。 必要に応じて、<row> 要素ラッパーの要素名を指定できます。 FOR XML PATH ('') )などの空の文字列が指定されている場合、ラッパー要素は生成されません。 PATH を使用すると、EXPLICIT ディレクティブを使用して記述されたクエリに代わる簡単な方法が提供される場合があります。 詳細については、「 FOR XML での PATH モードの使用」を参照してください。

BINARY BASE64

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

TYPE

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

ROOT [ ('RootName') ]

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

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

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

USE AdventureWorks2022;  
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 の

備考

Fabric Data Warehouse では、FOR JSON はクエリの最後の演算子である必要があるため、サブクエリ内では使用できません。

JSON

FOR JSON を指定し、JSON テキストとして書式設定されたクエリ結果を返します。 JSON モードとして自動またはパスも指定する必要があります。 FOR JSON 句の詳細については、「FOR JSON (SQL Server) を使用してクエリ結果を JSON として書式設定するを参照してください。

AUTO

FOR JSON AUTOを指定して、SELECT ステートメントの構造に基づいて JSON 出力を自動的に書式設定します。 詳細と例については、「AUTO モードで自動的に JSON 出力を書式設定する (SQL Server)」を参照してください。

PATH

FOR JSON PATHを指定して、JSON 出力の形式を完全に制御します。 PATH モードでは、ラッパー オブジェクトを作成し、複雑なプロパティを入れ子にすることができます。 詳細と例については、「PATH モードで入れ子になった JSON 出力を書式設定する (SQL Server)」を参照してください。

INCLUDE_NULL_VALUES

FOR JSON 句で INCLUDE_NULL_VALUES オプションを指定して、NULL 値を JSON 出力に含めます。 このオプションを指定しない場合、出力にはクエリ結果の NULL 値の JSON プロパティは含まれません。 詳細と例については、INCLUDE_NULL_VALUES オプションを使用して JSON の出力に Null 値を含める手順に関する記事を参照してください。

ROOT [ ('RootName') ]

FOR JSON 句で ROOT オプションを指定して、JSON 出力に最上位レベルの要素を 1 つ追加します。 ROOT オプションを指定しない場合、JSON 出力にはルート要素がありません。 詳細と例については、「ROOT オプションを使用して JSON 出力にルート ノードを追加する (SQL Server)」を参照してください。

WITHOUT_ARRAY_WRAPPER

FOR JSON 句で WITHOUT_ARRAY_WRAPPER オプションを指定して、JSON 出力を囲む角かっこを既定で削除します。 このオプションを指定しないと、JSON 出力が角かっこで囲まれます。 WITHOUT_ARRAY_WRAPPER オプションを使用して、単一の JSON オブジェクトを出力として生成します。 詳細については、WITHOUT_ARRAY_WRAPPER オプションを使用して JSON 出力から角かっこを削除する手順に関する記事を参照してください。

詳細については、「FOR JSON を使用してクエリ結果を JSON として書式設定する (SQL Server)」を参照してください。