SELECT - FOR 句 (Transact-SQL)
適用対象: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric の SQL 分析エンドポイント
Microsoft Fabric のウェアハウス
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 テーブルと tright テーブルを作成し、両方に c1 という単一列が含まれるようにします。 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 テーブルが外部結合ステートメントの内部に存在することを確認します。 これを実行するには、クエリ ウィンドウで次の 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 値を無視しなければならない場合、正しくない結果が返されることがあります。
Note
一意のインデックスに含まれる列で NULL 値を使用できない場合は、結果セットの NULL 値がすべて右外部結合ステートメントによって提供されます。
FOR XML
XML
クエリの結果を XML ドキュメントとして返します。 XML モードとして、RAW、AUTO、EXPLICIT のいずれか 1 つを指定する必要があります。 XML データと SQL Server の詳細については、「FOR XML (SQL Server)」を参照してください。
RAW [ ('ElementName') ]
クエリの結果を取得し、結果セット内の各行を、要素タグとして汎用識別子 <row /> が指定されている XML 要素に変換します。 必要に応じて、その行要素に名前を指定することもできます。 結果の XML 出力では、指定した ElementName が、行ごとに生成される行要素として使用されます。 詳細については、「 FOR XML での RAW モードの使用」を参照してください。
AUTO
クエリの結果を単純な入れ子の XML ツリーで返します。 FROM 句に含まれる各テーブルは、そのうち少なくとも 1 つの列が SELECT 句の一覧に示され、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 を使用することで、改行を防ぐことができます。 FOR JSON PATH を使用するときもこの解決策を適用できます。 この手法についてはスタック オーバーフローで論じられています。また、次の Transact-SQL サンプル SELECT ステートメントで確認できます。
Using SQL Server FOR XML:Convert Result Datatype to Text/varchar/string whatever? (SQL Server の FOR XML を使用する: Result データ型をテキスト/可変文字列/文字列に変換する)
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
列の値が NULL の場合、xsi:nil 属性が True に設定されている要素を作成します。 このオプションは、ELEMENTS ディレクティブでのみ指定できます。 詳細については、次を参照してください。
ABSENT
列の値が NULL の場合、対応する XML 要素を XML 結果に追加しません。 このオプションは、ELEMENTS でのみ指定してください。
PATH [ ('ElementName') ]
結果セットの各行に対して、<row> 要素ラッパーを生成します。 必要に応じて、<row> 要素ラッパーに要素名を指定することもできます。 FOR XML PATH ( '' ) ) などの空文字列を指定すると、ラッパー要素は生成されません。 EXPLICIT ディレクティブを使用するよりも、PATH を使用した方が、クエリが単純になる場合があります。 詳細については、「 FOR XML での PATH モードの使用」を参照してください。
BINARY BASE64
クエリは、バイナリ データをバイナリ ベース 64 エンコード形式で返します。 RAW モードおよび EXPLICIT モードでバイナリ データを取得する場合は、このオプションを指定する必要があります。 AUTO モードの場合は、これは既定値です。
TYPE
クエリが結果を xml 型で返すことを指定します。 詳細については、「 FOR XML クエリの TYPE ディレクティブ」を参照してください。
ROOT [ ('RootName') ]
単一のトップレベル要素を、結果として生成される XML に追加します。 必要に応じて、生成するルート要素名を指定することもできます。 オプションのルート名を指定しない場合は、既定の <root> 要素が追加されます。
詳細については、「FOR XML (SQL Server)」を参照してください。
FOR XML の例
次の例では、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 の
JSON
FOR JSON を指定し、JSON テキストとして書式設定されたクエリ結果を返します。 JSON モードとして自動またはパスも指定する必要があります。 FOR JSON 句の詳細については、「FOR JSON を使用してクエリ結果を JSON として書式設定する (SQL Server)」を参照してください。
AUTO
FOR JSON AUTO を指定すると、
SELECT ステートメントの構造に基づいて JSON 出力を自動的に書式設定します。 詳細と例については、「AUTO モードで自動的に JSON 出力を書式設定する (SQL Server)」を参照してください。
PATH
JSON 出力の書式設定を
FOR JSON PATH を指定して完全制御します。 PATH モードでは、ラッパー オブジェクトを作成し、複雑なプロパティを入れ子にすることができます。 詳細と例については、「PATH モードで入れ子になった JSON 出力を書式設定する (SQL Server)」を参照してください。
INCLUDE_NULL_VALUES
INCLUDE_NULL_VALUES オプションと FOR JSON 句を指定し、JSON 出力に NULL 値を含めます。 このオプションを指定しない場合、出力では、クエリ結果の NULL 値に対する JSON のプロパティは含まれません。 詳細と例については、INCLUDE_NULL_VALUES オプションを使用して JSON の出力に Null 値を含める手順に関する記事を参照してください。
ROOT [ ('RootName') ]
ROOT オプションと FOR JSON 句を指定し、最上位要素を 1 つ JSON 出力に追加します。 指定しない場合、 ROOT オプションでは、JSON の出力はルート要素がないです。 詳細と例については、「ROOT オプションを使用して JSON 出力にルート ノードを追加する (SQL Server)」を参照してください。
WITHOUT_ARRAY_WRAPPER
WITHOUT_ARRAY_WRAPPER オプションと FOR JSON 句を指定すると、JSON 出力を囲んでいる角かっこが既定で削除されます。 このオプションを指定しないと、JSON 出力が角かっこで囲まれます。 WITHOUT_ARRAY_WRAPPER オプションを使用すると、単一の JSON オブジェクトを出力として生成できます。 詳細については、WITHOUT_ARRAY_WRAPPER オプションを使用して JSON 出力から角かっこを削除する手順に関する記事を参照してください。
詳細については、「FOR JSON を使用してクエリ結果を JSON として書式設定する (SQL Server)」を参照してください。