INSERT (Transact-SQL)INSERT (Transact-SQL)

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

SQL ServerSQL Server で、1 つまたは複数の行をテーブルやビューに追加します。Adds one or more rows to a table or a view in SQL ServerSQL Server. 例については、「」を参照してください。For examples, see Examples.

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

構文Syntax

-- Syntax for SQL Server and Azure SQL Database  

[ WITH <common_table_expression> [ ,...n ] ]  
INSERT   
{  
        [ TOP ( expression ) [ PERCENT ] ]   
        [ INTO ]   
        { <object> | rowset_function_limited   
          [ WITH ( <Table_Hint_Limited> [ ...n ] ) ]  
        }  
    {  
        [ ( column_list ) ]   
        [ <OUTPUT Clause> ]  
        { VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n     ]   
        | derived_table   
        | execute_statement  
        | <dml_table_source>  
        | DEFAULT VALUES   
        }  
    }  
}  
[;]  
  
<object> ::=  
{   
    [ server_name . database_name . schema_name .   
      | database_name .[ schema_name ] .   
      | schema_name .   
    ]  
  table_or_view_name  
}  
  
<dml_table_source> ::=  
    SELECT <select_list>  
    FROM ( <dml_statement_with_output_clause> )   
      [AS] table_alias [ ( column_alias [ ,...n ] ) ]  
    [ WHERE <search_condition> ]  
        [ OPTION ( <query_hint> [ ,...n ] ) ]  
-- External tool only syntax  

INSERT   
{  
    [BULK]  
    { database_name.schema_name.table_or_view_name | schema_name.table_or_view_name | table_or_view_name }  
    ( <column_definition> )  
    [ WITH (  
        [ [ , ] CHECK_CONSTRAINTS ]  
        [ [ , ] FIRE_TRIGGERS ]  
        [ [ , ] KEEP_NULLS ]  
        [ [ , ] KILOBYTES_PER_BATCH = kilobytes_per_batch ]  
        [ [ , ] ROWS_PER_BATCH = rows_per_batch ]  
        [ [ , ] ORDER ( { column [ ASC | DESC ] } [ ,...n ] ) ]  
        [ [ , ] TABLOCK ]  
    ) ]  
}  
  
[; ] <column_definition> ::=  
 column_name <data_type>  
    [ COLLATE collation_name ]  
    [ NULL | NOT NULL ]  
  
<data type> ::=   
[ type_schema_name . ] type_name   
    [ ( precision [ , scale ] | max ]  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

INSERT INTO { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ ( column_name [ ,...n ] ) ]  
    {   
      VALUES ( { NULL | expression } )  
      | SELECT <select_criteria>  
    }  
    [ OPTION ( <query_option> [ ,...n ] ) ]  
[;]  

引数Arguments

WITH <common_table_expression>WITH <common_table_expression>
INSERT ステートメントのスコープ内で定義された、一時的な名前付き結果セット (共通テーブル式とも呼ばれる) を指定します。Specifies the temporary named result set, also known as common table expression, defined within the scope of the INSERT statement. 結果セットは SELECT ステートメントから派生します。The result set is derived from a SELECT statement. 詳細については、「WITH common_table_expression (Transact-SQL)」を参照してください。For more information, see WITH common_table_expression (Transact-SQL).

TOP (expression) [ PERCENT ]TOP (expression) [ PERCENT ]
挿入するランダムな行の数または比率 (%) を指定します。Specifies the number or percent of random rows that will be inserted. expression は行数または行の比率 (%) にすることができます。expression can be either a number or a percent of the rows. 詳細については、「TOP (Transact-SQL)」を参照してください。For more information, see TOP (Transact-SQL).

INTOINTO
INSERT キーワードと対象のテーブルとの間で使用できるキーワードで、省略可能です。Is an optional keyword that can be used between INSERT and the target table.

server_nameserver_name
適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

テーブルまたはビューが配置されているリンク サーバーの名前です。Is the name of the linked server on which the table or view is located. server_name は、リンク サーバー名として指定することも、OPENDATASOURCE 関数を使用して指定することもできます。server_name can be specified as a linked server name, or by using the OPENDATASOURCE function.

server_name をリンク サーバーとして指定する場合は、database_nameschema_name が必要です。When server_name is specified as a linked server, database_name and schema_name are required. server_name を OPENDATASOURCE で指定する場合は、database_name および schema_name がすべてのデータ ソースに適用されるとは限らず、リモート オブジェクトにアクセスする OLE DB プロバイダーの機能により制限されます。When server_name is specified with OPENDATASOURCE, database_name and schema_name may not apply to all data sources and is subject to the capabilities of the OLE DB provider that accesses the remote object.

database_namedatabase_name
適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

データベースの名前です。Is the name of the database.

schema_nameschema_name
テーブルまたはビューが属するスキーマの名前を指定します。Is the name of the schema to which the table or view belongs.

table_or view_nametable_or view_name
データを受け取るテーブルまたはビューの名前を指定します。Is the name of the table or view that is to receive the data.

table 変数は、そのスコープの中では、INSERT ステートメントでテーブル ソースとして使用できます。A table variable, within its scope, can be used as a table source in an INSERT statement.

table_or_view_name によって参照されるビューは更新可能であることが必要です。また、そのビューの FROM 句ではベース テーブルを 1 つだけ参照している必要があります。The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view. たとえば、複数のテーブルを参照するビューに対して INSERT を実行するには、1 つのベース テーブルの列のみを参照する column_list を使用する必要があります。For example, an INSERT into a multi-table view must use a column_list that references only columns from one base table. 更新可能なビューの詳細については、「CREATE VIEW (Transact-SQL)」を参照してください。For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

OPENQUERY 関数または OPENROWSET 関数を指定します。Is either the OPENQUERY or OPENROWSET function. これらの関数の使用は、リモート オブジェクトにアクセスする OLE DB プロバイダーの機能により制限されます。Use of these functions is subject to the capabilities of the OLE DB provider that accesses the remote object.

WITH ( <table_hint_limited> [... n ] )WITH ( <table_hint_limited> [... n ] )
対象のテーブルに設定可能なテーブル ヒントを 1 つ以上指定します。Specifies one or more table hints that are allowed for a target table. キーワード WITH とかっこが必要です。The WITH keyword and the parentheses are required.

READPAST、NOLOCK、および READUNCOMMITTED は指定できません。READPAST, NOLOCK, and READUNCOMMITTED are not allowed. テーブル ヒントの詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。For more information about table hints, see Table Hints (Transact-SQL).

重要

INSERT ステートメントの対象となるテーブルに対して、HOLDLOCK、SERIALIZABLE、READCOMMITTED、REPEATABLEREAD、および UPDLOCK のヒントを指定する機能は、将来のバージョンの SQL ServerSQL Server では削除される予定です。The ability to specify the HOLDLOCK, SERIALIZABLE, READCOMMITTED, REPEATABLEREAD, or UPDLOCK hints on tables that are targets of INSERT statements will be removed in a future version of SQL ServerSQL Server. これらのヒントは、INSERT ステートメントのパフォーマンスに影響を与えません。These hints do not affect the performance of INSERT statements. 新しい開発作業では、これらのオプションの使用は避け、現在これらを使用しているアプリケーションは修正するようにしてください。Avoid using them in new development work, and plan to modify applications that currently use them.

INSERT ステートメントの対象であるテーブルに対して TABLOCK ヒントを指定すると、TABLOCKX ヒントを指定した場合と同じ効果を得られます。Specifying the TABLOCK hint on a table that is the target of an INSERT statement has the same effect as specifying the TABLOCKX hint. テーブルに対して、排他ロックが取得されます。An exclusive lock is taken on the table.

(column_list)(column_list)
データを挿入する、1 つ以上の列で構成されるリストを指定します。Is a list of one or more columns in which to insert data. column_list はかっこで囲み、コンマで区切る必要があります。column_list must be enclosed in parentheses and delimited by commas.

column_list に列がない場合、データベース エンジンDatabase Engineでは、列の定義に基づいて値を設定できる必要があります。値を設定できない場合は行を読み込むことはできません。If a column is not in column_list, the データベース エンジンDatabase Engine must be able to provide a value based on the definition of the column; otherwise, the row cannot be loaded. データベース エンジンDatabase Engineは、列が次の条件を満たす場合、自動的に列に値を設定します。The データベース エンジンDatabase Engine automatically provides a value for the column if the column:

  • IDENTITY プロパティを持っている。Has an IDENTITY property. 増分された次の ID 値が使用されます。The next incremental identity value is used.

  • 既定値を持っている。Has a default. 列の既定値が使用されます。The default value for the column is used.

  • データ型は timestamp です。Has a timestamp data type. 現在のタイムスタンプ値が使用されます。The current timestamp value is used.

  • NULL 値が許可されます。Is nullable. NULL 値が使用されます。A null value is used.

  • 計算列である。Is a computed column. 計算値が使用されます。The calculated value is used.

ID 列に値を明示的に挿入するときは column_list を使用する必要があります。また、テーブルの SET IDENTITY_INSERT オプションを ON にする必要があります。column_list must be used when explicit values are inserted into an identity column, and the SET IDENTITY_INSERT option must be ON for the table.

OUTPUT 句OUTPUT Clause
挿入操作の一部として、挿入された行を返します。Returns inserted rows as part of the insert operation. 処理中のアプリケーションに結果を返すことも、テーブルまたはテーブル変数に結果を挿入して処理を続行することもできます。The results can be returned to the processing application or inserted into a table or table variable for further processing.

OUTPUT 句は、ローカル パーティション ビュー、分散パーティション ビュー、リモート テーブルのいずれかを参照する DML ステートメントではサポートされていません。また、execute_statement が含まれる INSERT ステートメントでもサポートされていません。The OUTPUT clause is not supported in DML statements that reference local partitioned views, distributed partitioned views, or remote tables, or INSERT statements that contain an execute_statement. OUTPUT INTO 句は、<dml_table_source> 句を含む INSERT ステートメントではサポートされません。The OUTPUT INTO clause is not supported in INSERT statements that contain a <dml_table_source> clause.

VALUESVALUES
追加するデータ値のリストを 1 つ以上指定します。Introduces the list or lists of data values to be inserted. column_list (指定されている場合) またはテーブル内の各列ごとに 1 つのデータ値が必要です。There must be one data value for each column in column_list, if specified, or in the table. 値リストは、かっこで囲む必要があります。The value list must be enclosed in parentheses.

値リスト内の値がテーブル内の列と同じ順序で並んでいない場合、またはテーブル内のすべての列に対応していない場合、column_list を使用して、各入力値を格納する列を明示的に指定する必要があります。If the values in the Value list are not in the same order as the columns in the table or do not have a value for each column in the table, column_list must be used to explicitly specify the column that stores each incoming value.

Transact-SQLTransact-SQL 行コンストラクター (テーブル値コンストラクターとも呼ばれる) を使用すると、単一の INSERT ステートメント内に複数の行を指定できます。You can use the Transact-SQLTransact-SQL row constructor (also called a table value constructor) to specify multiple rows in a single INSERT statement. 行コンストラクターは、かっこで囲まれ、コンマで区切られた複数の値リストを含む単一の VALUES 句で構成されています。The row constructor consists of a single VALUES clause with multiple value lists enclosed in parentheses and separated by a comma. 詳細については、「テーブル値コンストラクター (Transact-SQL)」を参照してください。For more information, see Table Value Constructor (Transact-SQL).

DEFAULTDEFAULT
データベース エンジンDatabase Engineによって、列に対して定義されている既定値が読み込まれます。Forces the データベース エンジンDatabase Engine to load the default value defined for a column. 既定値がなく、列に対して NULL が許可されている場合は、NULL が挿入されます。If a default does not exist for the column and the column allows null values, NULL is inserted. timestamp 型が定義されている列には、次のタイムスタンプ値が挿入されます。For a column defined with the timestamp data type, the next timestamp value is inserted. DEFAULT は ID 列には有効ではありません。DEFAULT is not valid for an identity column.

式 (expression)expression
定数、変数、または式を指定します。Is a constant, a variable, or an expression. 式には EXECUTE ステートメントを含めることができません。The expression cannot contain an EXECUTE statement.

Unicode 文字データ型 ncharnvarcharntext を参照している場合は、'expression' の前に大文字の 'N' を付ける必要があります。When referencing the Unicode character data types nchar, nvarchar, and ntext, 'expression' should be prefixed with the capital letter 'N'. 'N' が指定されていない場合、SQL ServerSQL Server では、文字列はデータベースまたは列の既定の照合順序に対応するコード ページに変換されます。If 'N' is not specified, SQL ServerSQL Server converts the string to the code page that corresponds to the default collation of the database or column. 文字列がこのコード ページにない場合は、失われます。Any characters not found in this code page are lost.

derived_tablederived_table
テーブルに読み込まれるデータの行を返す、有効な SELECT ステートメントを指定します。Is any valid SELECT statement that returns rows of data to be loaded into the table. SELECT ステートメントには、共通テーブル式 (CTE) を含めることはできません。The SELECT statement cannot contain a common table expression (CTE).

execute_statementexecute_statement
SELECT ステートメントまたは READTEXT ステートメントでデータを返す有効な EXECUTE ステートメントです。Is any valid EXECUTE statement that returns data with SELECT or READTEXT statements. 詳細については、「 EXECUTE (Transact-SQL)」を参照してください。For more information, see EXECUTE (Transact-SQL).

INSERT...EXEC ステートメントでは、EXECUTE ステートメントの RESULT SETS オプションを指定することができません。The RESULT SETS options of the EXECUTE statement cannot be specified in an INSERT...EXEC statement.

execute_statement を INSERT で使用する場合、各結果セットに、テーブルの列または column_list の列との互換性が必要です。If execute_statement is used with INSERT, each result set must be compatible with the columns in the table or in column_list.

execute_statement を使用して、同じサーバー上またはリモート サーバー上で、ストアド プロシージャを実行できます。execute_statement can be used to execute stored procedures on the same server or a remote server. リモート サーバーのプロシージャが実行されると、結果セットがローカル サーバーに返され、ローカル サーバーのテーブルに読み込まれます。The procedure in the remote server is executed, and the result sets are returned to the local server and loaded into the table in the local server. 分散トランザクションでは、接続で複数のアクティブな結果セット (MARS) が有効になっている場合、execute_statement をループバック リンク サーバーに対して実行できません。In a distributed transaction, execute_statement cannot be issued against a loopback linked server when the connection has multiple active result sets (MARS) enabled.

execute_statement が READTEXT ステートメントでデータを返す場合、各 READTEXT ステートメントは最大で 1 MB (1024 KB) のデータを返すことができます。If execute_statement returns data with the READTEXT statement, each READTEXT statement can return a maximum of 1 MB (1024 KB) of data. また execute_statement は、拡張プロシージャで使用することもできます。execute_statement can also be used with extended procedures. execute_statement は、拡張プロシージャのメイン スレッドによって返されたデータを挿入します。ただし、メイン スレッド以外のスレッドからの出力は挿入しません。execute_statement inserts the data returned by the main thread of the extended procedure; however, output from threads other than the main thread are not inserted.

テーブル値パラメーターは、INSERT EXEC ステートメントの対象として指定できませんが、INSERT EXEC 文字列またはストアド プロシージャにソースとして指定できます。You cannot specify a table-valued parameter as the target of an INSERT EXEC statement; however, it can be specified as a source in the INSERT EXEC string or stored-procedure. 詳細については、「テーブル値パラメーターの使用 (Database Engine)」を参照してください。For more information, see Use Table-Valued Parameters (Database Engine).

<dml_table_source><dml_table_source>
INSERT、UPDATE、DELETE、または MERGE ステートメントの OUTPUT 句で返された行 (WHERE 句でフィルター処理される場合もあります) を対象のテーブルに挿入するように指定します。Specifies that the rows inserted into the target table are those returned by the OUTPUT clause of an INSERT, UPDATE, DELETE, or MERGE statement, optionally filtered by a WHERE clause. <dml_table_source> を指定する場合は、外部の INSERT ステートメントの対象が次の制限を満たしている必要があります。If <dml_table_source> is specified, the target of the outer INSERT statement must meet the following restrictions:

  • ビューではなくベース テーブルである必要があります。It must be a base table, not a view.

  • リモート テーブルは使用できません。It cannot be a remote table.

  • トリガーが定義されているテーブルは使用できません。It cannot have any triggers defined on it.

  • 主キー/外部キーのリレーションシップに加えることはできません。It cannot participate in any primary key-foreign key relationships.

  • マージ レプリケーションや、トランザクション レプリケーションの更新可能なサブスクリプションに加えることはできません。It cannot participate in merge replication or updatable subscriptions for transactional replication.

データベース互換性レベルを 100 以上に設定する必要があります。The compatibility level of the database must be set to 100 or higher. 詳細については、を参照してください。 OUTPUT 句と #40 です。TRANSACT-SQL と #41;.For more information, see OUTPUT Clause (Transact-SQL).

<select_list><select_list>
Output 句から返された列のどれを挿入するかを指定するコンマ区切りのリストです。Is a comma-separated list specifying which columns returned by the OUTPUT clause to insert. <select_list> 内の列は、値の挿入先である列と互換である必要があります。The columns in <select_list> must be compatible with the columns into which values are being inserted. <select_list> では、集計関数または TEXTPTR を参照できません。<select_list> cannot reference aggregate functions or TEXTPTR.

注意

SELECT リストに含まれる変数は、<dml_statement_with_output_clause> で加えられる変更に関係なく、その元の値を参照します。Any variables listed in the SELECT list refer to their original values, regardless of any changes made to them in <dml_statement_with_output_clause>.

<dml_statement_with_output_clause><dml_statement_with_output_clause>
影響を受ける行を OUTPUT 句で返す有効な INSERT、UPDATE、DELETE、または MERGE ステートメントです。Is a valid INSERT, UPDATE, DELETE, or MERGE statement that returns affected rows in an OUTPUT clause. このステートメントには WITH 句を指定できず、リモート テーブルまたはパーティション ビューを対象にすることもできません。The statement cannot contain a WITH clause, and cannot target remote tables or partitioned views. UPDATE または DELETE を指定する場合、カーソルベースの UPDATE または DELETE は指定できません。If UPDATE or DELETE is specified, it cannot be a cursor-based UPDATE or DELETE. ソース行を、入れ子になった DML ステートメントとして参照することはできません。Source rows cannot be referenced as nested DML statements.

WHERE <search_condition>WHERE <search_condition>
<dml_statement_with_output_clause> で返された行をフィルター処理する有効な <search_condition> を含んだ WHERE 句です。Is any WHERE clause containing a valid <search_condition> that filters the rows returned by <dml_statement_with_output_clause>. 詳しくは、「検索条件 (Transact-SQL)」をご覧ください。For more information, see Search Condition (Transact-SQL). このコンテキストで使用される <search_condition> には、サブクエリ、データにアクセスするスカラー ユーザー定義関数、集計関数、TEXTPTR、またはフルテキスト検索述語を含めることができません。When used in this context, <search_condition> cannot contain subqueries, scalar user-defined functions that perform data access, aggregate functions, TEXTPTR, or full-text search predicates.

DEFAULT VALUESDEFAULT VALUES
適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

新しい行が、各列に対して定義されている既定値で構成されることを指定します。Forces the new row to contain the default values defined for each column.

BULKBULK
適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

外部ツールでバイナリ データ ストリームをアップロードする際に使用されます。Used by external tools to upload a binary data stream. このオプションは、SQL Server Management StudioSQL Server Management Studio、SQLCMD、OSQL などのツールや、SQL ServerSQL Server Native Client などのデータ アクセス アプリケーション プログラミング インターフェイスで使用することは想定されていません。This option is not intended for use with tools such as SQL Server Management StudioSQL Server Management Studio, SQLCMD, OSQL, or data access application programming interfaces such as SQL ServerSQL Server Native Client.

FIRE_TRIGGERSFIRE_TRIGGERS
適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

バイナリ データ ストリームのアップロード処理中に、変換先テーブルで定義されている挿入トリガーを実行することを指定します。Specifies that any insert triggers defined on the destination table execute during the binary data stream upload operation. 詳細については、「BULK INSERT (Transact-SQL)」を参照してください。For more information, see BULK INSERT (Transact-SQL).

CHECK_CONSTRAINTSCHECK_CONSTRAINTS
適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

バイナリ データ ストリームのアップロード処理中に、対象テーブルまたはビューに対するすべての制約を検証します。Specifies that all constraints on the target table or view must be checked during the binary data stream upload operation. 詳細については、「BULK INSERT (Transact-SQL)」を参照してください。For more information, see BULK INSERT (Transact-SQL).

KEEPNULLSKEEPNULLS
適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

バイナリ データ ストリームのアップロード処理中に、空の列の NULL 値を保持します。Specifies that empty columns should retain a null value during the binary data stream upload operation. 詳細については、「一括インポート中の NULL の保持または既定値の使用 (SQL Server)」をご覧ください。For more information, see Keep Nulls or Use Default Values During Bulk Import (SQL Server).

KILOBYTES_PER_BATCH = kilobytes_per_batchKILOBYTES_PER_BATCH = kilobytes_per_batch
バッチあたりのデータの概算キロバイト数 (KB) を kilobytes_per_batch として指定します。Specifies the approximate number of kilobytes (KB) of data per batch as kilobytes_per_batch. 詳細については、「BULK INSERT (Transact-SQL)」を参照してください。For more information, see BULK INSERT (Transact-SQL).

ROWS_PER_BATCH =rows_per_batchROWS_PER_BATCH =rows_per_batch
適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

バイナリ データ ストリーム内のデータ行の概算数を指定します。Indicates the approximate number of rows of data in the binary data stream. 詳細については、「BULK INSERT (Transact-SQL)」を参照してください。For more information, see BULK INSERT (Transact-SQL).

注意

列リストが指定されていない場合、構文エラーが発生します。A syntax error is raised if a column list is not provided.

RemarksRemarks

SQL グラフ テーブルへのデータの挿入に固有の情報については、「INSERT (SQL グラフ)」をご覧ください。For information specific to inserting data into SQL graph tables, see INSERT (SQL Graph).

ベスト プラクティスBest Practices

@@ROWCOUNT 関数を使用して、クライアント アプリケーションに挿入される行数を返します。Use the @@ROWCOUNT function to return the number of inserted rows to the client application. 詳細については、「@@ROWCOUNT (Transact-SQL)」を参照してください。For more information, see @@ROWCOUNT (Transact-SQL).

データの一括インポートに関するベスト プラクティスBest Practices for Bulk Importing Data

INSERT INTO...SELECT を使用したデータ一括インポート時の最小ログ記録Using INSERT INTO...SELECT to Bulk Import Data with Minimal Logging

INSERT INTO <target_table> SELECT <columns> FROM <source_table> を使用すると、最小ログ記録を行って、1 つのテーブル (ステージング テーブルなど) から別のテーブルに多数の行を効率的に転送できます。You can use INSERT INTO <target_table> SELECT <columns> FROM <source_table> to efficiently transfer a large number of rows from one table, such as a staging table, to another table with minimal logging. 最小ログ記録を行うと、ステートメントのパフォーマンスが向上します。また、トランザクションの実行中に、使用可能なトランザクション ログ領域がこの操作でいっぱいになる可能性を低減します。Minimal logging can improve the performance of the statement and reduce the possibility of the operation filling the available transaction log space during the transaction.

このステートメントの最小ログ記録には、次の要件があります。Minimal logging for this statement has the following requirements:

  • データベース復旧モデルが単純復旧モデルまたは一括ログ復旧モデルに設定されている。The recovery model of the database is set to simple or bulk-logged.

  • 対象テーブルが、空のヒープか、空でないヒープである。The target table is an empty or nonempty heap.

  • 対象テーブルがレプリケーションで使用されない。The target table is not used in replication.

  • 対象テーブルに TABLOCK ヒントが指定されている。The TABLOCK hint is specified for the target table.

MERGE ステートメントでの挿入操作の結果としてヒープに挿入される行についても、最小ログ記録が行われる場合があります。Rows that are inserted into a heap as the result of an insert action in a MERGE statement may also be minimally logged.

より制限の少ない一括更新ロックを保持する BULK INSERT ステートメントとは異なり、TABLOCK ヒントが指定された INSERT INTO...SELECT は、テーブルに対する排他的な (X) ロックを保持します。Unlike the BULK INSERT statement, which holds a less restrictive Bulk Update lock, INSERT INTO...SELECT with the TABLOCK hint holds an exclusive (X) lock on the table. したがって、並列挿入操作を使用して行を挿入することはできません。This means that you cannot insert rows using parallel insert operations.

OPENROWSET および BULK によるデータの一括インポートUsing OPENROWSET and BULK to Bulk Import Data

OPENROWSET 関数では次のテーブル ヒントを使用できます。これらのテーブル ヒントにより、一括読み込みの最適化を INSERT ステートメントで利用できます。The OPENROWSET function can accept the following table hints, which provide bulk-load optimizations with the INSERT statement:

  • TABLOCK ヒントを使用すると、挿入操作のログ レコード数を最小化できます。The TABLOCK hint can minimize the number of log records for the insert operation. データベース復旧モデルが単純復旧モデルまたは一括ログ復旧モデルに設定されている必要があります。また、対象テーブルはレプリケーションで使用できません。The recovery model of the database must be set to simple or bulk-logged and the target table cannot be used in replication. 詳細については、「一括インポートで最小ログ記録を行うための前提条件」次を参照してください。For more information, see Prerequisites for Minimal Logging in Bulk Import.

  • IGNORE_CONSTRAINTS ヒントを使用すると、FOREIGN KEY および CHECK の制約チェックを一時的に無効にできます。The IGNORE_CONSTRAINTS hint can temporarily disable FOREIGN KEY and CHECK constraint checking.

  • IGNORE_TRIGGERS ヒントを使用すると、トリガーの実行を一時的に無効にできます。The IGNORE_TRIGGERS hint can temporarily disable trigger execution.

  • KEEPDEFAULTS ヒントを使用すると、データ レコードにテーブルの列値が含まれていない場合に、NULL の代わりにテーブル列の既定値を挿入できます。The KEEPDEFAULTS hint allows the insertion of a table column's default value, if any, instead of NULL when the data record lacks a value for the column.

  • KEEPIDENTITY ヒントを使用すると、インポートしたデータ ファイルの ID 値を対象テーブルの ID 列に使用できます。The KEEPIDENTITY hint allows the identity values in the imported data file to be used for the identity column in the target table.

これらは、BULK INSERT コマンドで使用可能な最適化と似ています。These optimizations are similar to those available with the BULK INSERT command. 詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。For more information, see Table Hints (Transact-SQL).

データ型Data Types

行の挿入時には、次のデータ型の動作を考慮してください。When you insert rows, consider the following data type behavior:

  • charvarcharvarbinary 型の列に値が読み込まれる場合、後続の空白 (charvarchar の場合は空白、varbinary の場合は 0) の埋め込みや切り捨ては、テーブルが作成されたときに列に対して定義された SET ANSI_PADDING の設定値によって決まります。If a value is being loaded into columns with a char, varchar, or varbinary data type, the padding or truncation of trailing blanks (spaces for char and varchar, zeros for varbinary) is determined by the SET ANSI_PADDING setting defined for the column when the table was created. 詳細については、「SET ANSI_PADDING (Transact-SQL)」を参照してください。For more information, see SET ANSI_PADDING (Transact-SQL).

    次の表は、SET ANSI_PADDING OFF の既定の操作を示します。The following table shows the default operation for SET ANSI_PADDING OFF.

    データ型Data type 既定の操作Default operation
    charchar 定義された列幅になるように値に空白を埋めます。Pad value with spaces to the defined width of column.
    varcharvarchar 空白以外の最終文字に達するまで、後続の空白を削除します。文字列が空白だけで構成されている場合は、1 つのスペース文字を残して、後続の空白を削除します。Remove trailing spaces to the last non-space character or to a single-space character for strings made up of only spaces.
    varbinaryvarbinary 後続の 0 を削除します。Remove trailing zeros.
  • varchar 型または text 型の列に空文字列 (' ') が読み込まれると、既定の操作では、長さが 0 の文字列が読み込まれます。If an empty string (' ') is loaded into a column with a varchar or text data type, the default operation is to load a zero-length string.

  • text 型列または image 型列に NULL 値を挿入した場合、有効なテキスト ポインターは作成されず、また、8 KB のテキスト ページもあらかじめ割り当てられません。Inserting a null value into a text or image column does not create a valid text pointer, nor does it preallocate an 8-KB text page.

  • uniqueidentifier 型で作成される列は、特別にフォーマットされた 16 バイトのバイナリ値を格納します。Columns created with the uniqueidentifier data type store specially formatted 16-byte binary values. ID 列の場合とは異なり、データベース エンジンDatabase Engineは、uniqueidentifier 型の列に対して自動的に値を生成しません。Unlike with identity columns, the データベース エンジンDatabase Engine does not automatically generate values for columns with the uniqueidentifier data type. 挿入操作の際、uniqueidentifier 列には、uniqueidentifier 型の変数と、xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (ハイフンを含む 36 文字で、x は 0 ~ 9 または a ~ f の範囲の 16 進数値) という形式の文字列定数を使用できます。During an insert operation, variables with a data type of uniqueidentifier and string constants in the form xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (36 characters including hyphens, where x is a hexadecimal digit in the range 0-9 or a-f) can be used for uniqueidentifier columns. たとえば、uniqueidentifier 変数または列には、6F9619FF-8B86-D011-B42D-00C04FC964FF という値を指定できます。For example, 6F9619FF-8B86-D011-B42D-00C04FC964FF is a valid value for a uniqueidentifier variable or column. GUID を取得するには、NEWID() 関数を使用します。Use the NEWID() function to obtain a globally unique ID (GUID).

ユーザー定義型の列への値の挿入Inserting Values into User-Defined Type Columns

ユーザー定義型の列に値を挿入するには、次のようにします。You can insert values in user-defined type columns by:

  • そのユーザー定義型の値を指定します。Supplying a value of the user-defined type.

  • ユーザー定義型で SQL ServerSQL Server システム データ型からの暗黙的または明示的な変換がサポートされている場合は、そのシステム データ型の値を指定します。Supplying a value in a SQL ServerSQL Server system data type, as long as the user-defined type supports implicit or explicit conversion from that type. 次の例は、文字列からの明示的な変換によって、ユーザー定義型 Point の列に値を挿入する方法を示しています。The following example shows how to insert a value in a column of user-defined type Point, by explicitly converting from a string.

    INSERT INTO Cities (Location)  
    VALUES ( CONVERT(Point, '12.3:46.2') );  
    

    明示的な変換を実行することなく、バイナリ値を指定することもできます。これは、すべてのユーザー定義型が、バイナリからの暗黙的な変換が可能であるためです。A binary value can also be supplied without performing explicit conversion, because all user-defined types are implicitly convertible from binary.

  • そのユーザー定義型の値を返すユーザー定義関数を呼び出します。Calling a user-defined function that returns a value of the user-defined type. 次の例では、ユーザー定義関数 CreateNewPoint() を使用してユーザー定義型 Point の新しい値を作成し、この値を Cities テーブルに挿入します。The following example uses a user-defined function CreateNewPoint() to create a new value of user-defined type Point and insert the value into the Cities table.

    INSERT INTO Cities (Location)  
    VALUES ( dbo.CreateNewPoint(x, y) );  
    

エラー処理Error Handling

TRY...CATCH 構造でステートメントを指定することで、INSERT ステートメントのエラー処理を実装できます。You can implement error handling for the INSERT statement by specifying the statement in a TRY...CATCH construct.

INSERT ステートメントが制約やルールに違反していたり、その値が列のデータ型と互換性を持たない場合は、ステートメントが失敗し、エラー メッセージが返されます。If an INSERT statement violates a constraint or rule, or if it has a value incompatible with the data type of the column, the statement fails and an error message is returned.

INSERT が SELECT または EXECUTE で複数の行を読み込んでいる場合、読み込まれている値でルールや制約の違反が発生すると、ステートメントが停止し、行は読み込まれません。If INSERT is loading multiple rows with SELECT or EXECUTE, any violation of a rule or constraint that occurs from the values being loaded causes the statement to be stopped, and no rows are loaded.

INSERT ステートメントの中で、式の評価中に算術エラー (オーバーフロー、0 による除算、またはドメイン エラー) が発生すると、データベース エンジンDatabase Engineでは、SET ARITHABORT が ON に設定されている場合と同様に、これらのエラーが処理されます。When an INSERT statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, the データベース エンジンDatabase Engine handles these errors as if SET ARITHABORT is set to ON. バッチは停止し、エラー メッセージが返されます。The batch is stopped, and an error message is returned. SET ARITHABORT と SET ANSI_WARNINGS を OFF に設定して式を評価中に、INSERT、DELETE、または UPDATE ステートメントで算術演算エラー、オーバーフロー、0 除算、またはドメイン エラーが検出されると、SQL ServerSQL Server では NULL 値が挿入または更新されます。During expression evaluation when SET ARITHABORT and SET ANSI_WARNINGS are OFF, if an INSERT, DELETE or UPDATE statement encounters an arithmetic error, overflow, divide-by-zero, or a domain error, SQL ServerSQL Server inserts or updates a NULL value. 出力先の列で NULL 値が許容されない場合は、挿入または更新処理は失敗し、エラーが返されます。If the target column is not nullable, the insert or update action fails and the user receives an error.

相互運用性Interoperability

テーブルやビューを対象とする INSERT 操作で INSTEAD OF トリガーが定義されている場合は、INSERT ステートメントの代わりにトリガーが実行されます。When an INSTEAD OF trigger is defined on INSERT actions against a table or view, the trigger executes instead of the INSERT statement. INSTEAD OF トリガーの詳細については、「CREATE TRIGGER (Transact-SQL)」を参照してください。For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

制限事項と制約事項Limitations and Restrictions

リモート テーブルに値を挿入するとき、すべての列のすべての値が指定されている場合を除いて、指定された値をどの列に挿入するかをユーザーが指定する必要があります。When you insert values into remote tables and not all values for all columns are specified, you must identify the columns to which the specified values are to be inserted.

TOP を INSERT と共に使用する場合、参照される行は任意の順序に並べられません。また、このステートメントで、ORDER BY 句を直接指定することはできません。When TOP is used with INSERT the referenced rows are not arranged in any order and the ORDER BY clause can not be directly specified in this statements. TOP を使用して意味のある順序で行を挿入する必要がある場合は、サブセレクト ステートメントで ORDER BY 句を指定して TOP を使用する必要があります。If you need to use TOP to insert rows in a meaningful chronological order, you must use TOP together with an ORDER BY clause that is specified in a subselect statement. 例については、後の「例」のセクションを参照してください。See the Examples section that follows in this topic.

SELECT と ORDER BY を使って行を作成する INSERT クエリでは、ID 値の計算方法は保証されますが、行の挿入順序は保証されません。INSERT queries that use SELECT with ORDER BY to populate rows guarantees how identity values are computed but not the order in which the rows are inserted.

Parallel Data Warehouse では、ORDER BY 句は、TOP も一緒に指定しない限り、VIEWS、CREATE TABLE AS SELECT、INSERT SELECT、インライン関数、派生テーブル、サブクエリ、共通テーブル式では無効です。In Parallel Data Warehouse, the ORDER BY clause is invalid in VIEWS, CREATE TABLE AS SELECT, INSERT SELECT, inline functions, derived tables, subqueries and common table expressions, unless TOP is also specified.

ログ記録の動作Logging Behavior

INSERT ステートメントは、常に完全にログに記録されます。ただし、BULK キーワードを指定して OPENROWSET 関数を使用している場合、または INSERT INTO <target_table> SELECT <columns> FROM <source_table> を使用している場合は除きます。The INSERT statement is always fully logged except when using the OPENROWSET function with the BULK keyword or when using INSERT INTO <target_table> SELECT <columns> FROM <source_table>. これらの操作のログへの記録は最小限にできます。These operations can be minimally logged. 詳細については、前の「データの一括読み込みの推奨事項」を参照してください。For more information, see the section "Best Practices for Bulk Loading Data" earlier in this topic.

SecuritySecurity

リンク サーバーに接続する場合、送信側サーバーは受信側サーバーに接続するためにログイン名とパスワードをリンク サーバーに代わって提供します。During a linked server connection, the sending server provides a login name and password to connect to the receiving server on its behalf. この接続を機能させるには、sp_addlinkedsrvlogin を使用して、リンク サーバー間でログイン マッピングを作成する必要があります。For this connection to work, you must create a login mapping between the linked servers by using sp_addlinkedsrvlogin.

OPENROWSET(BULK...) を使用するにあたっては、SQL ServerSQL Server で権限借用がどのように処理されるかを理解しておくことが重要です。When you use OPENROWSET(BULK...), it is important to understand how SQL ServerSQL Server handles impersonation. 詳しくは、「BULK INSERT または OPENROWSET(BULK...) を使用した一括データのインポート (SQL Server)」の「セキュリティに関する考慮事項」をご覧ください。For more information, see "Security Considerations" in Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) (SQL Server).

アクセス許可Permissions

対象のテーブルに対する INSERT 権限が必要です。INSERT permission is required on the target table.

INSERT 権限は、既定では sysadmin 固定サーバー ロール、db_owner 固定データベース ロール、および db_datawriter 固定データベース ロールのメンバーと、テーブル所有者に与えられています。INSERT permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. sysadmindb_owner、および db_securityadmin ロールのメンバー、およびテーブル所有者は、他のユーザーに権限を譲渡できます。Members of the sysadmin, db_owner, and the db_securityadmin roles, and the table owner can transfer permissions to other users.

OPENROWSET 関数の BULK オプションで INSERT を実行するには、sysadmin 固定サーバー ロールまたは bulkadmin 固定サーバー ロールのメンバーであることが必要です。To execute INSERT with the OPENROWSET function BULK option, you must be a member of the sysadmin fixed server role or of the bulkadmin fixed server role.

使用例Examples

カテゴリCategory 主な構文要素Featured syntax elements
基本構文Basic syntax INSERT • テーブル値コンストラクターINSERT • table value constructor
列の値を処理するHandling column values IDENTITY • NEWID • 既定値 • ユーザー定義型IDENTITY • NEWID • default values • user-defined types
他のテーブルのデータを挿入するInserting data from other tables INSERT...SELECT • INSERT...EXECUTE • WITH 共通テーブル式 • TOP • OFFSET FETCHINSERT...SELECT • INSERT...EXECUTE • WITH common table expression • TOP • OFFSET FETCH
標準的なテーブル以外の対象オブジェクトを指定するSpecifying target objects other than standard tables ビュー • テーブル変数Views • table variables
リモート テーブルに行を挿入するInserting rows into a remote table リンク サーバー、OPENQUERY 行セット関数、OPENDATASOURCE 行セット関数Linked server • OPENQUERY rowset function • OPENDATASOURCE rowset function
テーブルまたはデータ ファイルのデータを一括読み込みするBulk loading data from tables or data files INSERT...SELECT • OPENROWSET 関数INSERT...SELECT • OPENROWSET function
ヒントを使用してクエリ オプティマイザーの既定の動作をオーバーライドするOverriding the default behavior of the query optimizer by using hints テーブル ヒントTable hints
INSERT ステートメントの結果をキャプチャするCapturing the results of the INSERT statement OUTPUT 句OUTPUT clause

基本構文Basic Syntax

このセクションの例では、最低限必要な構文を使用して INSERT ステートメントの基本機能を示します。Examples in this section demonstrate the basic functionality of the INSERT statement using the minimum required syntax.

A.A. 1 行のデータを挿入するInserting a single row of data

次の例では、AdventureWorks2012AdventureWorks2012 データベースの Production.UnitMeasure テーブルに 1 行を挿入します。The following example inserts one row into the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database. このテーブルの列は、UnitMeasureCodeName、および ModifiedDate です。The columns in this table are UnitMeasureCode, Name, and ModifiedDate. すべての列の値が指定され、テーブルの列と同じ順序で並んでいるため、列名を列リストで指定する必要はありません Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list .

INSERT INTO Production.UnitMeasure  
VALUES (N'FT', N'Feet', '20080414');  

B.B. 複数行のデータを挿入するInserting multiple rows of data

次の例では、単一の INSERT ステートメントでテーブル値コンストラクターを使用して、AdventureWorks2012AdventureWorks2012 データベースの Production.UnitMeasure テーブルに 3 行を挿入します。The following example uses the table value constructor to insert three rows into the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database in a single INSERT statement. すべての列の値が指定され、テーブルの列と同じ順序で並んでいるため、列名を列リストで指定する必要はありません。Because values for all columns are supplied and are listed in the same order as the columns in the table, the column names do not have to be specified in the column list.

INSERT INTO Production.UnitMeasure  
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
    , (N'Y3', N'Cubic Yards', '20080923');  

C.C. テーブルの列と順序が異なるデータを挿入するInserting data that is not in the same order as the table columns

次の例では、列リストを使用して、各列に挿入する値を明示的に指定します。The following example uses a column list to explicitly specify the values that are inserted into each column. AdventureWorks2012AdventureWorks2012 データベースの Production.UnitMeasure テーブルの列の順序は、UnitMeasureCodeNameModifiedDate です。ただし、column_list では列がその順序で並んでいません。The column order in the Production.UnitMeasure table in the AdventureWorks2012AdventureWorks2012 database is UnitMeasureCode, Name, ModifiedDate; however, the columns are not listed in that order in column_list.

INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,  
    ModifiedDate)  
VALUES (N'Square Yards', N'Y2', GETDATE());  

列の値を処理するHandling Column Values

このセクションの例では、IDENTITY プロパティ、DEFAULT 値、または uniqueidentifer 列やユーザー定義型の列などのデータ型で定義された列に値を挿入する方法を示します。Examples in this section demonstrate methods of inserting values into columns that are defined with an IDENTITY property, DEFAULT value, or are defined with data types such as uniqueidentifer or user-defined type columns.

D.D. 列が既定値に設定されているテーブルにデータを挿入するInserting data into a table with columns that have default values

次の例では、値が自動生成される列や既定値が設定される列を使用して、テーブルに行を挿入します。The following example shows inserting rows into a table with columns that automatically generate a value or have a default value. Column_1 は、文字列と column_2 に挿入される値を連結して値を自動的に生成する計算列です。Column_1 is a computed column that automatically generates a value by concatenating a string with the value inserted into column_2. Column_2 は、既定の制約で定義されています。Column_2 is defined with a default constraint. この列の値が指定されていない場合、既定値が使用されます。If a value is not specified for this column, the default value is used. Column_3rowversion データ型で定義されており、一意の増分する 2 進数を自動的に生成します。Column_3 is defined with the rowversion data type, which automatically generates a unique, incrementing binary number. Column_4 は、値の自動生成を行いません。Column_4 does not automatically generate a value. この列の値が指定されていない場合、NULL が挿入されます。When a value for this column is not specified, NULL is inserted. INSERT ステートメントでは、すべての列ではなく一部の列の値を含む行を挿入します。The INSERT statements insert rows that contain values for some of the columns but not all. 最後の INSERT ステートメントでは、どの列も指定されていないため、DEFAULT VALUES 句を使用して既定値のみが挿入されます。In the last INSERT statement, no columns are specified and only the default values are inserted by using the DEFAULT VALUES clause.

CREATE TABLE dbo.T1   
(  
    column_1 AS 'Computed column ' + column_2,   
    column_2 varchar(30)   
        CONSTRAINT default_name DEFAULT ('my column default'),  
    column_3 rowversion,  
    column_4 varchar(40) NULL  
);  
GO  
INSERT INTO dbo.T1 (column_4)   
    VALUES ('Explicit value');  
INSERT INTO dbo.T1 (column_2, column_4)   
    VALUES ('Explicit value', 'Explicit value');  
INSERT INTO dbo.T1 (column_2)   
    VALUES ('Explicit value');  
INSERT INTO T1 DEFAULT VALUES;   
GO  
SELECT column_1, column_2, column_3, column_4  
FROM dbo.T1;  
GO  

E.E. ID 列を持つテーブルにデータを挿入するInserting data into a table with an identity column

次の例では、ID 列にデータを挿入する方法をいくつか示します。The following example shows different methods of inserting data into an identity column. 最初の 2 つの INSERT ステートメントで、新規の行に対して ID 値が生成されます。The first two INSERT statements allow identity values to be generated for the new rows. 3 番目の INSERT ステートメントは、SET IDENTITY_INSERT ステートメントで設定された列の IDENTITY プロパティをオーバーライドし、ID 列に値を明示的に挿入します。The third INSERT statement overrides the IDENTITY property for the column with the SET IDENTITY_INSERT statement and inserts an explicit value into the identity column.

CREATE TABLE dbo.T1 ( column_1 int IDENTITY, column_2 VARCHAR(30));  
GO  
INSERT T1 VALUES ('Row #1');  
INSERT T1 (column_2) VALUES ('Row #2');  
GO  
SET IDENTITY_INSERT T1 ON;  
GO  
INSERT INTO T1 (column_1,column_2)   
    VALUES (-99, 'Explicit identity value');  
GO  
SELECT column_1, column_2  
FROM T1;  
GO  

F.F. NEWID() を使用して uniqueidentifier 列にデータを挿入するInserting data into a uniqueidentifier column by using NEWID()

次の例では、NEWID() 関数を使用して、column_2 の GUID を取得します。The following example uses the NEWID() function to obtain a GUID for column_2. ID 列とは異なり、データベース エンジンDatabase Engineでは uniqueidentifier 型の列に対して自動的に値が生成されません。2 番目の INSERT ステートメントを参照してください。Unlike for identity columns, the データベース エンジンDatabase Engine does not automatically generate values for columns with the uniqueidentifier data type, as shown by the second INSERT statement.

CREATE TABLE dbo.T1   
(  
    column_1 int IDENTITY,   
    column_2 uniqueidentifier,  
);  
GO  
INSERT INTO dbo.T1 (column_2)   
    VALUES (NEWID());  
INSERT INTO T1 DEFAULT VALUES;   
GO  
SELECT column_1, column_2  
FROM dbo.T1;  
  

G.G. ユーザー定義型の列にデータを挿入するInserting data into user-defined type columns

次の Transact-SQLTransact-SQL ステートメントでは、Points テーブルの PointValue 列に 3 行を挿入します。The following Transact-SQLTransact-SQL statements insert three rows into the PointValue column of the Points table. この列は、CLR ユーザー定義型 (UDT) を使用しています。This column uses a CLR user-defined type (UDT). Point データ型は、UDT のプロパティとして公開されている整数値 X と Y で構成されます。The Point data type consists of X and Y integer values that are exposed as properties of the UDT. コンマ区切りの X と Y の値を Point 型にキャストするには、CAST 関数または CONVERT 関数のいずれかを使用する必要があります。You must use either the CAST or CONVERT function to cast the comma-delimited X and Y values to the Point type. 最初の 2 つのステートメントでは、CONVERT 関数を使用し、3 つ目のステートメントでは CAST 関数を使用して、文字列値を Point 型に変換しています。The first two statements use the CONVERT function to convert a string value to the Point type, and the third statement uses the CAST function. 詳しくは、「UDT データの操作」をご覧ください。For more information, see Manipulating UDT Data.

INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '3,4'));  
INSERT INTO dbo.Points (PointValue) VALUES (CONVERT(Point, '1,5'));  
INSERT INTO dbo.Points (PointValue) VALUES (CAST ('1,99' AS Point));  

他のテーブルのデータを挿入するInserting Data from Other Tables

このセクションの例では、あるテーブルの行を別のテーブルに挿入する方法を示します。Examples in this section demonstrate methods of inserting rows from one table into another table.

H.H. SELECT および EXECUTE オプションを使用して他のテーブルのデータを挿入するUsing the SELECT and EXECUTE options to insert data from other tables

次の例では、INSERT...SELECT または INSERT...EXECUTE を使用して、あるテーブルのデータを別のテーブルに挿入する方法を示します。The following example shows how to insert data from one table into another table by using INSERT...SELECT or INSERT...EXECUTE. 各方法は、列リストに式とリテラル値を含む複数のテーブルを参照する SELECT ステートメントに基づきます。Each is based on a multi-table SELECT statement that includes an expression and a literal value in the column list.

1 番目の INSERT ステートメントでは、SELECT ステートメントを使用して AdventureWorks2012AdventureWorks2012 データベースのソース テーブル (EmployeeSalesPerson、および Person) からデータを取得し、その結果セットを EmployeeSales テーブルに格納します。The first INSERT statement uses a SELECT statement to derive the data from the source tables (Employee, SalesPerson, and Person) in the AdventureWorks2012AdventureWorks2012 database and store the result set in the EmployeeSales table. 2 番目の INSERT ステートメントは、EXECUTE 句を使用して SELECT ステートメントを含むストアド プロシージャを呼び出します。3 番目の INSERT ステートメントは、EXECUTE 句を使用して SELECT ステートメントをリテラル文字列として参照します。The second INSERT statement uses the EXECUTE clause to call a stored procedure that contains the SELECT statement, and the third INSERT uses the EXECUTE clause to reference the SELECT statement as a literal string.

CREATE TABLE dbo.EmployeeSales  
( DataSource   varchar(20) NOT NULL,  
  BusinessEntityID   varchar(11) NOT NULL,  
  LastName     varchar(40) NOT NULL,  
  SalesDollars money NOT NULL  
);  
GO  
CREATE PROCEDURE dbo.uspGetEmployeeSales   
AS   
    SET NOCOUNT ON;  
    SELECT 'PROCEDURE', sp.BusinessEntityID, c.LastName,   
        sp.SalesYTD   
    FROM Sales.SalesPerson AS sp    
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.BusinessEntityID LIKE '2%'  
    ORDER BY sp.BusinessEntityID, c.LastName;  
GO  
--INSERT...SELECT example  
INSERT INTO dbo.EmployeeSales  
    SELECT 'SELECT', sp.BusinessEntityID, c.LastName, sp.SalesYTD   
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.BusinessEntityID LIKE '2%'  
    ORDER BY sp.BusinessEntityID, c.LastName;  
GO  
--INSERT...EXECUTE procedure example  
INSERT INTO dbo.EmployeeSales   
EXECUTE dbo.uspGetEmployeeSales;  
GO  
--INSERT...EXECUTE('string') example  
INSERT INTO dbo.EmployeeSales   
EXECUTE   
('  
SELECT ''EXEC STRING'', sp.BusinessEntityID, c.LastName,   
    sp.SalesYTD   
    FROM Sales.SalesPerson AS sp   
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.BusinessEntityID LIKE ''2%''  
    ORDER BY sp.BusinessEntityID, c.LastName  
');  
GO  
--Show results.  
SELECT DataSource,BusinessEntityID,LastName,SalesDollars  
FROM dbo.EmployeeSales;  

I.I. WITH 共通テーブル式を使用して挿入するデータを定義するUsing WITH common table expression to define the data inserted

次の例では、AdventureWorks2012AdventureWorks2012 データベースに NewEmployee テーブルを作成します。The following example creates the NewEmployee table in the AdventureWorks2012AdventureWorks2012 database. 共通テーブル式 (EmployeeTemp) で、NewEmployee テーブルに挿入する 1 つ以上のテーブルの行を定義します。A common table expression (EmployeeTemp) defines the rows from one or more tables to be inserted into the NewEmployee table. INSERT ステートメントは、共通テーブル式の列を参照します。The INSERT statement references the columns in the common table expression.

CREATE TABLE HumanResources.NewEmployee  
(  
    EmployeeID int NOT NULL,  
    LastName nvarchar(50) NOT NULL,  
    FirstName nvarchar(50) NOT NULL,  
    PhoneNumber Phone NULL,  
    AddressLine1 nvarchar(60) NOT NULL,  
    City nvarchar(30) NOT NULL,  
    State nchar(3) NOT NULL,   
    PostalCode nvarchar(15) NOT NULL,  
    CurrentFlag Flag  
);  
GO  
WITH EmployeeTemp (EmpID, LastName, FirstName, Phone,   
                   Address, City, StateProvince,   
                   PostalCode, CurrentFlag)  
AS (SELECT   
       e.BusinessEntityID, c.LastName, c.FirstName, pp.PhoneNumber,  
       a.AddressLine1, a.City, sp.StateProvinceCode,   
       a.PostalCode, e.CurrentFlag  
    FROM HumanResources.Employee e  
        INNER JOIN Person.BusinessEntityAddress AS bea  
        ON e.BusinessEntityID = bea.BusinessEntityID  
        INNER JOIN Person.Address AS a  
        ON bea.AddressID = a.AddressID  
        INNER JOIN Person.PersonPhone AS pp  
        ON e.BusinessEntityID = pp.BusinessEntityID  
        INNER JOIN Person.StateProvince AS sp  
        ON a.StateProvinceID = sp.StateProvinceID  
        INNER JOIN Person.Person as c  
        ON e.BusinessEntityID = c.BusinessEntityID  
    )  
INSERT INTO HumanResources.NewEmployee   
    SELECT EmpID, LastName, FirstName, Phone,   
           Address, City, StateProvince, PostalCode, CurrentFlag  
    FROM EmployeeTemp;  
GO  

J.J. TOP を使用してソース テーブルから挿入されるデータを制限するUsing TOP to limit the data inserted from the source table

次の例では、EmployeeSales テーブルを作成し、ランダムに選ばれた上位 5 人の従業員の名前と年度累計売り上げデータを AdventureWorks2012AdventureWorks2012 データベースの HumanResources.Employee テーブルから挿入します。The following example creates the table EmployeeSales and inserts the name and year-to-date sales data for the top 5 random employees from the table HumanResources.Employee in the AdventureWorks2012AdventureWorks2012 database. INSERT ステートメントにより、SELECT ステートメントで返された任意の 5 行が選択されます。The INSERT statement chooses any 5 rows returned by the SELECT statement. OUTPUT 句は、EmployeeSales テーブルに挿入される行を表示します。The OUTPUT clause displays the rows that are inserted into the EmployeeSales table. 上位 5 人の従業員を特定するために SELECT ステートメントの ORDER BY 句を使用することはありません。Notice that the ORDER BY clause in the SELECT statement is not used to determine the top 5 employees.

CREATE TABLE dbo.EmployeeSales  
( EmployeeID   nvarchar(11) NOT NULL,  
  LastName     nvarchar(20) NOT NULL,  
  FirstName    nvarchar(20) NOT NULL,  
  YearlySales  money NOT NULL  
 );  
GO  
INSERT TOP(5)INTO dbo.EmployeeSales  
    OUTPUT inserted.EmployeeID, inserted.FirstName, 
        inserted.LastName, inserted.YearlySales  
    SELECT sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD   
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.SalesYTD > 250000.00  
    ORDER BY sp.SalesYTD DESC;  

TOP を使用して意味のある順序で行を挿入する必要がある場合は、次の例に示すように、サブセレクト ステートメントで ORDER BY を指定して TOP を使用する必要があります。If you have to use TOP to insert rows in a meaningful chronological order, you must use TOP together with ORDER BY in a subselect statement as shown in the following example. OUTPUT 句は、EmployeeSales テーブルに挿入される行を表示します。The OUTPUT clause displays the rows that are inserted into the EmployeeSales table. ランダムな行の代わりに、ORDER BY 句の結果に基づいて、上位 5 人の従業員が挿入されます。Notice that the top 5 employees are now inserted based on the results of the ORDER BY clause instead of random rows.

INSERT INTO dbo.EmployeeSales  
    OUTPUT inserted.EmployeeID, inserted.FirstName, 
        inserted.LastName, inserted.YearlySales  
    SELECT TOP (5) sp.BusinessEntityID, c.LastName, c.FirstName, sp.SalesYTD   
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.SalesYTD > 250000.00  
    ORDER BY sp.SalesYTD DESC;  

標準的なテーブル以外の対象オブジェクトを指定するSpecifying Target Objects Other Than Standard Tables

このセクションの例では、ビューまたはテーブル変数を指定して行を挿入する方法を示します。Examples in this section demonstrate how to insert rows by specifying a view or table variable.

K.K. ビューを指定してデータを挿入するInserting data by specifying a view

次の例では、対象オブジェクトとしてビュー名を指定します。しかし、新しい行は基になるベース テーブルに挿入されます。The following example specifies a view name as the target object; however, the new row is inserted in the underlying base table. INSERT ステートメント内の値の順番は、ビューの列の順番に一致している必要があります。The order of the values in the INSERT statement must match the column order of the view. 詳細については、「ビューを使用したデータ変更」を参照してください。For more information, see Modify Data Through a View.

CREATE TABLE T1 ( column_1 int, column_2 varchar(30));  
GO  
CREATE VIEW V1 AS   
SELECT column_2, column_1   
FROM T1;  
GO  
INSERT INTO V1   
    VALUES ('Row 1',1);  
GO  
SELECT column_1, column_2   
FROM T1;  
GO  
SELECT column_1, column_2  
FROM V1;  
GO  

L.L. テーブル変数を指定してデータを挿入するInserting data into a table variable

次の例では、AdventureWorks2012AdventureWorks2012 データベースの対象オブジェクトとしてテーブル変数を指定します。The following example specifies a table variable as the target object in the AdventureWorks2012AdventureWorks2012 database.

-- Create the table variable.  
DECLARE @MyTableVar table(  
    LocationID int NOT NULL,  
    CostRate smallmoney NOT NULL,  
    NewCostRate AS CostRate * 1.5,  
    ModifiedDate datetime);  
  
-- Insert values into the table variable.  
INSERT INTO @MyTableVar (LocationID, CostRate, ModifiedDate)  
    SELECT LocationID, CostRate, GETDATE() 
    FROM Production.Location  
    WHERE CostRate > 0;  
  
-- View the table variable result set.  
SELECT * FROM @MyTableVar;  
GO  

リモート テーブルに行を挿入するInserting Rows into a Remote Table

このセクションの例では、リンク サーバーまたは行セット関数を使用してリモート テーブルを参照し、リモートの対象テーブルに行を挿入する方法を示します。Examples in this section demonstrate how to insert rows into a remote target table by using a linked server or a rowset function to reference the remote table.

M.M. リンク サーバーを使用してリモート テーブルにデータを挿入するInserting data into a remote table by using a linked server

次の例では、リモート テーブルに行を挿入します。The following example inserts rows into a remote table. sp_addlinkedserver を使用してリモート データ ソースへのリンクを作成した後、The example begins by creating a link to the remote data source by using sp_addlinkedserver. server.catalog.schema.object という形式の、4 つの要素で構成されたオブジェクト名の一部として、リンク サーバー名 MyLinkServer を指定します。The linked server name, MyLinkServer, is then specified as part of the four-part object name in the form server.catalog.schema.object.

適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' 
-- or 'server_nameinstance_name'.  
  
EXEC sp_addlinkedserver @server = N'MyLinkServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI',   
    @datasrc = N'server_name',  
    @catalog = N'AdventureWorks2012';  
GO  
-- Specify the remote data source in the FROM clause using a four-part name   
-- in the form linked_server.catalog.schema.object.  
  
INSERT INTO MyLinkServer.AdventureWorks2012.HumanResources.Department (Name, GroupName)  
VALUES (N'Public Relations', N'Executive General and Administration');  
GO  

N.N. OPENQUERY 関数を使用してリモート テーブルにデータを挿入するInserting data into a remote table by using the OPENQUERY function

次の例では、OPENQUERY 行セット関数を指定してリモート テーブルに行を挿入します。The following example inserts a row into a remote table by specifying the OPENQUERY rowset function. この例では、前の例で作成したリンク サーバー名を使用します。The linked server name created in the previous example is used in this example.

適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

INSERT OPENQUERY (MyLinkServer, 
    'SELECT Name, GroupName 
     FROM AdventureWorks2012.HumanResources.Department')  
VALUES ('Environmental Impact', 'Engineering');  
GO  

O.O. OPENDATASOURCE 関数を使用してリモート テーブルにデータを挿入するInserting data into a remote table by using the OPENDATASOURCE function

次の例では、OPENDATASOURCE 行セット関数を指定してリモート テーブルに行を挿入します。The following example inserts a row into a remote table by specifying the OPENDATASOURCE rowset function. server_name または server_name\instance_name という形式を使用して、データ ソースの有効なサーバー名を指定します。Specify a valid server name for the data source by using the format server_name or server_name\instance_name.

適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

-- Use the OPENDATASOURCE function to specify the remote data source.  
-- Specify a valid server name for Data Source using the format 
-- server_name or server_nameinstance_name.  
  
INSERT INTO OPENDATASOURCE('SQLNCLI',  
    'Data Source= <server_name>; Integrated Security=SSPI')  
    .AdventureWorks2012.HumanResources.Department (Name, GroupName)  
    VALUES (N'Standards and Methods', 'Quality Assurance');  
GO  

P.P. PolyBase を使用して作成された外部のテーブルに挿入するInserting into an external table created using PolyBase

Hadoop または Azure ストレージに SQL Server からのデータをエクスポートします。Export data from SQL Server to Hadoop or Azure Storage. 最初に、変換先ファイルまたはディレクトリを指す外部テーブルを作成します。First, create an external table that points to the destination file or directory. 次に、ローカルの SQL Server テーブルからのデータを外部データ ソースをエクスポートするのに INSERT INTO 使用します。Then, use INSERT INTO to export data from a local SQL Server table to an external data source. INSERT INTO ステートメントでは、存在しないと、SELECT ステートメントの結果は、指定されたファイルの形式で指定した場所にエクスポートする場合、変換先ファイルまたはディレクトリを作成します。The INSERT INTO statement creates the destination file or directory if it does not exist and the results of the SELECT statement are exported to the specified location in the specified file format. 詳細については、「 PolyBase 入門」を参照してください。For more information, see Get started with PolyBase.

適用対象: SQL Server 2017SQL Server 2017Applies to: SQL Server 2017SQL Server 2017.

-- Create an external table.   
CREATE EXTERNAL TABLE [dbo].[FastCustomers2009] (  
        [FirstName] char(25) NOT NULL,   
        [LastName] char(25) NOT NULL,   
        [YearlyIncome] float NULL,   
        [MaritalStatus] char(1) NOT NULL  
)  
WITH (  
        LOCATION='/old_data/2009/customerdata.tbl',  
        DATA_SOURCE = HadoopHDP2,  
        FILE_FORMAT = TextFileFormat,  
        REJECT_TYPE = VALUE,  
        REJECT_VALUE = 0  
);  
  
-- Export data: Move old data to Hadoop while keeping 
-- it query-able via external table.  

INSERT INTO dbo.FastCustomer2009  
SELECT T.* FROM Insured_Customers T1 JOIN CarSensor_Data T2  
ON (T1.CustomerKey = T2.CustomerKey)  
WHERE T2.YearMeasured = 2009 and T2.Speed > 40;  

テーブルまたはデータ ファイルのデータを一括読み込みするBulk Loading Data from Tables or Data Files

このセクションの例では、INSERT ステートメントを使用してテーブルにデータを一括読み込みする 2 つの方法を示します。Examples in this section demonstrate two methods to bulk load data into a table by using the INSERT statement.

Q.Q. 最小ログ記録を行ってヒープにデータを挿入するInserting data into a heap with minimal logging

次の例では、新しいテーブル (ヒープ) を作成し、最小ログ記録を使用して、別のテーブルのデータをそのテーブルに挿入します。The following example creates a new table (a heap) and inserts data from another table into it using minimal logging. この例では、AdventureWorks2012 データベースの復旧モデルが FULL に設定されていると想定しています。The example assumes that the recovery model of the AdventureWorks2012 database is set to FULL. したがって、最小ログ記録が使用されるようにするために、行を挿入する前に AdventureWorks2012 データベースの復旧モデルを BULK_LOGGED に設定し、INSERT INTO...SELECT ステートメントの後に FULL に戻しています。To ensure minimal logging is used, the recovery model of the AdventureWorks2012 database is set to BULK_LOGGED before rows are inserted and reset to FULL after the INSERT INTO...SELECT statement. また、対象テーブル Sales.SalesHistory に TABLOCK ヒントが指定されています。In addition, the TABLOCK hint is specified for the target table Sales.SalesHistory. これにより、ステートメントが使用するトランザクション ログの領域が最小化され、ステートメントが効率的に実行されるようになります。This ensures that the statement uses minimal space in the transaction log and performs efficiently.

-- Create the target heap.  
CREATE TABLE Sales.SalesHistory(  
    SalesOrderID int NOT NULL,  
    SalesOrderDetailID int NOT NULL,  
    CarrierTrackingNumber nvarchar(25) NULL,  
    OrderQty smallint NOT NULL,  
    ProductID int NOT NULL,  
    SpecialOfferID int NOT NULL,  
    UnitPrice money NOT NULL,  
    UnitPriceDiscount money NOT NULL,  
    LineTotal money NOT NULL,  
    rowguid uniqueidentifier ROWGUIDCOL  NOT NULL,  
    ModifiedDate datetime NOT NULL );  
GO  
-- Temporarily set the recovery model to BULK_LOGGED.  
ALTER DATABASE AdventureWorks2012  
SET RECOVERY BULK_LOGGED;  
GO  
-- Transfer data from Sales.SalesOrderDetail to Sales.SalesHistory  
INSERT INTO Sales.SalesHistory WITH (TABLOCK)  
    (SalesOrderID,   
     SalesOrderDetailID,  
     CarrierTrackingNumber,   
     OrderQty,   
     ProductID,   
     SpecialOfferID,   
     UnitPrice,   
     UnitPriceDiscount,  
     LineTotal,   
     rowguid,   
     ModifiedDate)  
SELECT * FROM Sales.SalesOrderDetail;  
GO  
-- Reset the recovery model.  
ALTER DATABASE AdventureWorks2012  
SET RECOVERY FULL;  
GO  

R.R. OPENROWSET 関数を BULK を指定して使用し、テーブルにデータを一括読み込みするUsing the OPENROWSET function with BULK to bulk load data into a table

次の例は、OPENROWSET 関数を指定することによって、テーブルにデータ ファイルからの行を挿入します。The following example inserts rows from a data file into a table by specifying the OPENROWSET function. パフォーマンスを最適化するために、IGNORE_TRIGGERS テーブル ヒントを指定しています。The IGNORE_TRIGGERS table hint is specified for performance optimization. 他の例については、「BULK INSERT または OPENROWSET(BULK...) を使用した一括データのインポート (SQL Server)」をご覧ください。For more examples, see Import Bulk Data by Using BULK INSERT or OPENROWSET(BULK...) (SQL Server).

適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

INSERT INTO HumanResources.Department WITH (IGNORE_TRIGGERS) (Name, GroupName)  
SELECT b.Name, b.GroupName   
FROM OPENROWSET (  
    BULK 'C:SQLFilesDepartmentData.txt',  
    FORMATFILE = 'C:SQLFilesBulkloadFormatFile.xml',  
    ROWS_PER_BATCH = 15000)AS b ;  

ヒントを使用してクエリ オプティマイザーの既定の動作をオーバーライドするOverriding the Default Behavior of the Query Optimizer by Using Hints

このセクションの例では、テーブル ヒントを使用して、INSERT ステートメントを処理する際のクエリ オプティマイザーの既定の動作を一時的にオーバーライドする方法を示します。Examples in this section demonstrate how to use table hints to temporarily override the default behavior of the query optimizer when processing the INSERT statement.

注意事項

通常、SQL ServerSQL Server クエリ オプティマイザーでは、クエリにとって最適な実行プランが選択されるため、ヒントは、経験を積んだ開発者やデータベース管理者が最後の手段としてのみ使用することをお勧めします。Because the SQL ServerSQL Server query optimizer typically selects the best execution plan for a query, we recommend that hints be used only as a last resort by experienced developers and database administrators.

S.S. TABLOCK ヒントを使用してロック手法を指定するUsing the TABLOCK hint to specify a locking method

次の例では、Production.Location テーブルに対して排他 (X) ロックを使用することと、このロックを INSERT ステートメントの終了まで保持することを指定します。The following example specifies that an exclusive (X) lock is taken on the Production.Location table and is held until the end of the INSERT statement.

適用対象: SQL ServerSQL ServerSQL DatabaseSQL DatabaseApplies to: SQL ServerSQL Server, SQL DatabaseSQL Database.

INSERT INTO Production.Location WITH (XLOCK)  
(Name, CostRate, Availability)  
VALUES ( N'Final Inventory', 15.00, 80.00);  

INSERT ステートメントの結果をキャプチャするCapturing the Results of the INSERT Statement

このセクションの例では、OUTPUT 句を使用して、INSERT ステートメントの影響を受ける各行の情報や、それらに基づく式を返す方法を示します。Examples in this section demonstrate how to use the OUTPUT Clause to return information from, or expressions based on, each row affected by an INSERT statement. これらの結果は処理アプリケーションに返され、確認メッセージの表示、アーカイブ化、その他のアプリケーション要件で使用することができます。These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements.

T.T. OUTPUT を INSERT ステートメントで使用するUsing OUTPUT with an INSERT statement

次の例では、ScrapReason テーブルに 1 行を挿入し、OUTPUT 句を使用してステートメントの結果を @MyTableVar テーブル変数に返します。The following example inserts a row into the ScrapReason table and uses the OUTPUT clause to return the results of the statement to the @MyTableVar table variable. ScrapReasonID 列が IDENTITY プロパティで定義されているため、INSERT ステートメントではこの列の値を指定していません。Because the ScrapReasonID column is defined with an IDENTITY property, a value is not specified in the INSERT statement for that column. ただし、データベース エンジンDatabase Engineによってこの列用に生成された値が、OUTPUT 句で INSERTED.ScrapReasonID 列に返されます。However, note that the value generated by the データベース エンジンDatabase Engine for that column is returned in the OUTPUT clause in the INSERTED.ScrapReasonID column.

DECLARE @MyTableVar table( NewScrapReasonID smallint,  
                           Name varchar(50),  
                           ModifiedDate datetime);  
INSERT Production.ScrapReason  
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate  
        INTO @MyTableVar  
VALUES (N'Operator error', GETDATE());  
  
--Display the result set of the table variable.  
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;  
--Display the result set of the table.  
SELECT ScrapReasonID, Name, ModifiedDate   
FROM Production.ScrapReason;  

U.U. ID 列と計算列で OUTPUT を使用するUsing OUTPUT with identity and computed columns

次の例では、EmployeeSales テーブルを作成し、INSERT ステートメントを使用してこのテーブルに複数行を挿入します。基になるテーブルからデータを取得するため、SELECT ステートメントも使用します。The following example creates the EmployeeSales table and then inserts several rows into it using an INSERT statement with a SELECT statement to retrieve data from source tables. EmployeeSales テーブルには、ID 列 (EmployeeID) および計算列 (ProjectedSales) があります。The EmployeeSales table contains an identity column (EmployeeID) and a computed column (ProjectedSales). これらの値はデータベース エンジンDatabase Engineによって挿入操作中に生成されるため、いずれの列も @MyTableVar で定義できません。Because these values are generated by the データベース エンジンDatabase Engine during the insert operation, neither of these columns can be defined in @MyTableVar.

CREATE TABLE dbo.EmployeeSales  
( EmployeeID   int IDENTITY (1,5)NOT NULL,  
  LastName     nvarchar(20) NOT NULL,  
  FirstName    nvarchar(20) NOT NULL,  
  CurrentSales money NOT NULL,  
  ProjectedSales AS CurrentSales * 1.10   
);  
GO  
DECLARE @MyTableVar table(  
  LastName     nvarchar(20) NOT NULL,  
  FirstName    nvarchar(20) NOT NULL,  
  CurrentSales money NOT NULL  
  );  
  
INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales)  
  OUTPUT INSERTED.LastName,   
         INSERTED.FirstName,   
         INSERTED.CurrentSales  
  INTO @MyTableVar  
    SELECT c.LastName, c.FirstName, sp.SalesYTD  
    FROM Sales.SalesPerson AS sp  
    INNER JOIN Person.Person AS c  
        ON sp.BusinessEntityID = c.BusinessEntityID  
    WHERE sp.BusinessEntityID LIKE '2%'  
    ORDER BY c.LastName, c.FirstName;  
  
SELECT LastName, FirstName, CurrentSales  
FROM @MyTableVar;  
GO  
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales  
FROM dbo.EmployeeSales;  

V.V. OUTPUT 句から返されたデータを挿入するInserting data returned from an OUTPUT clause

次の例では、MERGE ステートメントの OUTPUT 句から返されたデータをキャプチャし、そのデータを別のテーブルに挿入します。The following example captures data returned from the OUTPUT clause of a MERGE statement, and inserts that data into another table. MERGE ステートメントは、AdventureWorks2012AdventureWorks2012 データベースの SalesOrderDetail テーブル内で処理される注文に基づいて、ProductInventory テーブルの Quantity 列を毎日更新します。The MERGE statement updates the Quantity column of the ProductInventory table daily, based on orders that are processed in the SalesOrderDetail table in the AdventureWorks2012AdventureWorks2012 database. また、在庫が 0 になった製品の行を削除します。It also deletes rows for products whose inventories drop to 0. この例では、削除された行をキャプチャし、在庫がない製品を追跡する別のテーブル ZeroInventory に挿入します。The example captures the rows that are deleted and inserts them into another table, ZeroInventory, which tracks products with no inventory.

--Create ZeroInventory table.  
CREATE TABLE Production.ZeroInventory (DeletedProductID int, RemovedOnDate DateTime);  
GO  
  
INSERT INTO Production.ZeroInventory (DeletedProductID, RemovedOnDate)  
SELECT ProductID, GETDATE()  
FROM  
(   MERGE Production.ProductInventory AS pi  
    USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod  
           JOIN Sales.SalesOrderHeader AS soh  
           ON sod.SalesOrderID = soh.SalesOrderID  
           AND soh.OrderDate = '20070401'  
           GROUP BY ProductID) AS src (ProductID, OrderQty)  
    ON (pi.ProductID = src.ProductID)  
    WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0  
        THEN DELETE  
    WHEN MATCHED  
        THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty  
    OUTPUT $action, deleted.ProductID) AS Changes (Action, ProductID)  
WHERE Action = 'DELETE';  
IF @@ROWCOUNT = 0  
PRINT 'Warning: No rows were inserted';  
GO  
SELECT DeletedProductID, RemovedOnDate FROM Production.ZeroInventory;  

W.W. SELECT オプションを使用してデータを挿入するInserting data using the SELECT option

次の例では、INSERT ステートメントと SELECT オプションを使って複数のデータ行を挿入する方法を示します。The following example shows how to insert multiple rows of data using an INSERT statement with a SELECT option. 1 番目の INSERT ステートメントでは、SELECT ステートメントを使用して、コピー元のテーブルからデータを直接取得し、結果セットを EmployeeTitles テーブルに格納します。The first INSERT statement uses a SELECT statement directly to retrieve data from the source table, and then to store the result set in the EmployeeTitles table.

CREATE TABLE EmployeeTitles  
( EmployeeKey   INT NOT NULL,  
  LastName     varchar(40) NOT NULL,  
  Title      varchar(50) NOT NULL  
);  
INSERT INTO EmployeeTitles  
    SELECT EmployeeKey, LastName, Title   
    FROM ssawPDW.dbo.DimEmployee  
    WHERE EndDate IS NULL;  

X.X. INSERT ステートメントでラベルを指定するSpecifying a label with the INSERT statement

次の例では、INSERT ステートメントでのラベルの使用を示します。The following example shows the use of a label with an INSERT statement.

-- Uses AdventureWorks  
  
INSERT INTO DimCurrency   
VALUES (500, N'C1', N'Currency1')  
OPTION ( LABEL = N'label1' );  

Y.Y. INSERT ステートメントでラベルとクエリ ヒントを使用するUsing a label and a query hint with the INSERT statement

このクエリでは、INSERT ステートメントでラベルとクエリの結合ヒントを使用するための基本構文を示します。This query shows the basic syntax for using a label and a query join hint with the INSERT statement. クエリが、コントロール ノード に送信されたた後で、コンピューティング ノード上で実行されている SQL ServerSQL Server が、SQL ServerSQL Server クエリ プランを生成するときにハッシュ結合の方法を適用します。After the query is submitted to the Control node, SQL ServerSQL Server, running on the Compute nodes, will apply the hash join strategy when it generates the SQL ServerSQL Server query plan. 結合ヒントと OPTION 句の使用方法の詳細については、「OPTION (SQL Server PDW)」を参照してください。For more information on join hints and how to use the OPTION clause, see OPTION (SQL Server PDW).

-- Uses AdventureWorks  
  
INSERT INTO DimCustomer (CustomerKey, CustomerAlternateKey, 
    FirstName, MiddleName, LastName )   
SELECT ProspectiveBuyerKey, ProspectAlternateKey, 
    FirstName, MiddleName, LastName  
FROM ProspectiveBuyer p JOIN DimGeography g ON p.PostalCode = g.PostalCode  
WHERE g.CountryRegionCode = 'FR'  
OPTION ( LABEL = 'Add French Prospects', HASH JOIN);  

参照See Also

BULK INSERT (Transact-SQL) BULK INSERT (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
FROM (Transact-SQL) FROM (Transact-SQL)
IDENTITY (Property) (Transact-SQL) IDENTITY (Property) (Transact-SQL)
NEWID (Transact-SQL) NEWID (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
MERGE (Transact-SQL) MERGE (Transact-SQL)
OUTPUT 句 (Transact-SQL) OUTPUT Clause (Transact-SQL)
inserted テーブルと deleted テーブルの使用Use the inserted and deleted Tables