SELECT - FOR 句 (Transact-SQL)
適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric の SQL 分析エンドポイント
Microsoft Fabric のウェアハウス
Microsoft Fabric のSQL データベース
FOR 句を使用し、クエリ結果に次のいずれかのオプションを指定します。
FOR BROWSE
を指定して、参照モードカーソルでクエリ結果を表示しているときに更新を許可します。FOR XML
を指定して、クエリ結果を XML として書式設定します。FOR JSON
を指定して、クエリ結果を JSON として書式設定します。
構文
[ 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 テーブルのデータにアクセスしようとした場合。
外部結合ステートメントの内部に存在するテーブルに一意のインデックスが定義されている場合。
ブラウズ モードでこの動作を再現するには、以下の手順を行います。
SQL Server Management Studio で、
SampleDB
という名前のデータベースを作成します。SampleDB
データベースで、tleft
テーブルと、c1
という名前の単一の列を含むtright
テーブルを作成します。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
テーブルが外部 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 モードを指定する必要があります。RAW
、AUTO
、EXPLICIT
。 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 属性にマップされます。 このオプションは、RAW
、AUTO
、および 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 AUTO
を TYPE
オプションおよび 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)」を参照してください。