INSERT (Transact-SQL)
テーブルまたはビューに新しい行を追加します。
構文
[ 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 ] )
| derived_table
| execute_statement
}
}
| DEFAULT VALUES
[; ]
<object> ::=
{
[ server_name . database_name . schema_name .
| database_name .[ schema_name ] .
| schema_name .
]
table_or_view_name
}
引数
WITH <common_table_expression>
INSERT ステートメントのスコープ内で定義された、一時的な名前付き結果セット (共通テーブル式とも呼ばれる) を指定します。結果セットは SELECT ステートメントから派生します。共通テーブル式は、SELECT、DELETE、UPDATE、CREATE VIEW の各ステートメントでも使用できます。詳細については、「WITH common_table_expression (Transact-SQL)」を参照してください。
TOP (expression) [ PERCENT ]
挿入するランダムな行の数または比率 (%) を指定します。expression は行数または行の比率 (%) にすることができます。INSERT、UPDATE、または DELETE と共に使用される TOP 式で参照される行は、任意の順序に並べられません。INSERT、UPDATE、および DELETE の各ステートメントで TOP を使用する場合は、expression を区切るかっこが必要です。詳細については、「TOP (Transact-SQL)」を参照してください。
- INTO
INSERT キーワードと対象のテーブルとの間で使用できるキーワードで、省略可能です。
- server_name
テーブルまたはビューが配置されているサーバーの名前を指定します (OPENDATASOURCE 関数をサーバー名として使用)。server_name を指定した場合は、database_name および schema_name も指定する必要があります。
- database_name
データベースの名前を指定します。
- schema_name
テーブルまたはビューが属するスキーマの名前を指定します。
table_or view_name
データを受け取るテーブルまたはビューの名前を指定します。table 変数は、そのスコープの中では、INSERT ステートメントでテーブル ソースとして使用できます。
table_or_view_name によって参照されるビューは更新可能であることが必要です。また、そのビューの FROM 句ではベース テーブルを 1 つだけ参照している必要があります。たとえば、複数のテーブルを参照するビューに対して INSERT を実行するには、1 つのベース テーブルの列のみを参照する column_list を使用する必要があります。更新可能なビューの詳細については、「CREATE VIEW (Transact-SQL)」を参照してください。
- rowset_function_limited
OPENQUERY 関数または OPENROWSET 関数を指定します。
WITH ( <table_hint_limited> [... n ] )
対象のテーブルに設定可能なテーブル ヒントを指定します。キーワード WITH とかっこが必要になります。READPAST、NOLOCK、および READUNCOMMITTED は指定できません。テーブル ヒントの詳細については、「テーブル ヒント (Transact-SQL)」を参照してください。
重要 : INSERT ステートメントの対象となるテーブルに対して、HOLDLOCK、SERIALIZABLE、READCOMMITTED、REPEATABLEREAD、および UPDLOCK のヒントを指定する機能は、将来のバージョンの SQL Server では削除される予定です。これらのヒントは、INSERT ステートメントのパフォーマンスに影響を与えません。新しい開発作業では、これらのオプションの使用は避け、現在これらを使用しているアプリケーションは修正するようにしてください。 INSERT ステートメントの対象であるテーブルに対して TABLOCK ヒントを指定すると、TABLOCKX ヒントを指定した場合と同じ効果を得られます。テーブルに対して、排他ロックが取得されます。
(column_list)
データを挿入する 1 つ以上の列で構成されるリストを指定します。column_list はかっこで囲み、コンマで区切る必要があります。column_list に列がない場合、SQL Server 2005 データベース エンジンでは、列の定義に基づいて値を設定できる必要があります。値を設定できない場合は行を読み込むことはできません。データベース エンジンは、列が次の条件を満たす場合、自動的に列に値を設定します。
- IDENTITY プロパティを持っている。増分された次の ID 値が使用されます。
- 既定値を持っている。列の既定値が使用されます。
- timestamp データ型である。現在のタイムスタンプ値が使用されます。
- NULL 値は許可されます。NULL 値が使用されます。
- 計算列である。計算値が使用されます。
ID 列に値を明示的に挿入するときには、column_list と VALUES リストを使用する必要があります。また、テーブルの SET IDENTITY_INSERT オプションは ON にする必要があります。
- OUTPUT 句
挿入操作の一部として、挿入された行を返します。OUTPUT 句は、ローカル パーティション ビュー、分散パーティション ビュー、リモート テーブルのいずれかを参照する DML ステートメントではサポートされていません。また、execute_statement が含まれる INSERT ステートメントでもサポートされていません。
VALUES
挿入するデータ値のリストを指定します。column_list (指定されている場合) またはテーブル内の列ごとに 1 つのデータ値が必要です。VALUES リストは、かっこで囲む必要があります。VALUES リスト内の値がテーブル内の列と同じ順序で並んでいない場合、またはテーブル内のすべての列に対応していない場合、column_list を使用して、各入力値を格納する列を明示的に指定する必要があります。
- DEFAULT
データベース エンジンによって、列に対して定義されている既定値が読み込まれます。既定値がなく、列に対して NULL 値が許可されている場合は、NULL が挿入されます。timestamp データ型が定義されている列には、次のタイムスタンプ値が挿入されます。DEFAULT は ID 列には有効ではありません。
- expression
定数、変数、または式を指定します。式に SELECT ステートメントまたは EXECUTE ステートメントを含めることはできません。
- derived_table
テーブルに読み込まれるデータの行を返す、有効な SELECT ステートメントを指定します。SELECT ステートメントには、共通テーブル式 (CTE) を含めることはできません。
execute_statement
SELECT ステートメントまたは READTEXT ステートメントでデータを返す有効な EXECUTE ステートメントです。SELECT ステートメントには、CTE を含めることはできません。execute_statement を INSERT で使用する場合、各結果セットに、テーブルの列または column_list の列との互換性が必要です。
execute_statement を使用して、同じサーバー上またはリモート サーバー上で、ストアド プロシージャを実行できます。リモート サーバーのプロシージャが実行されると、結果セットがローカル サーバーに返され、ローカル サーバーのテーブルに読み込まれます。
SQL Server 2008 では、ループバック リンク サーバーに対して実行される INSERT...EXECUTE ステートメントのトランザクション セマンティクスが変更されています。SQL Server 2005 では、このシナリオはサポートされていないのでエラーになります。SQL Server 2008 では、接続で複数のアクティブな結果セット (MARS) が有効になっていない場合、INSERT...EXECUTE ステートメントをループバック リンク サーバーに対して実行できます。接続で MARS が有効になっている場合は、SQL Server 2005 と同じ動作になります。
execute_statement が READTEXT ステートメントでデータを返す場合、各 READTEXT ステートメントは最大で 1 MB (1024 KB) のデータを返すことができます。また execute_statement は、拡張プロシージャで使用することもできます。execute_statement は、拡張プロシージャのメイン スレッドによって返されたデータを挿入します。ただし、メイン スレッド以外のスレッドからの出力は挿入しません。
- DEFAULT VALUES
新しい行が、各列に対して定義されている既定値で構成されることを指定します。
解説
INSERT は、テーブルに新しい行を追加します。テーブル内のデータを置換するには、DELETE ステートメントまたは TRUNCATE TABLE ステートメントを使用して既存のデータを消去してから、INSERT で新しいデータを読み込む必要があります。既存の行の任意の列の値を変更するには UPDATE を使用してください。テーブルを新規作成し、これにデータを読み込むという操作を 1 回の手順で行うには、SELECT ステートメントの INTO オプションを使用します。
uniqueidentifier 型で作成される列は、特別にフォーマットされた 16 バイトのバイナリ値を格納します。ID 列の場合とは異なり、データベース エンジンは、uniqueidentifier 型の列に対して自動的に値を生成しません。挿入操作の際、uniqueidentifier 列には、uniqueidentifier 型の変数と、xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (ハイフンを含む 36 文字で、x は 0-9 または a-f の範囲の 16 進数値) という形式の文字列定数を使用できます。たとえば、uniqueidentifier 変数または列には、6F9619FF-8B86-D011-B42D-00C04FC964FF という値を指定できます。GUID を取得するには、NEWID() 関数を使用します。
SET ROWCOUNT オプションの設定は、ローカルおよびリモート パーティション ビューに対する INSERT ステートメントにおいて無視されます。また、互換性レベルが 80 以上に設定されている場合、データベース エンジンのリモート テーブルに対する INSERT ステートメントでは、このオプションはサポートされません。
INSERT ステートメントの中で、式の評価中に算術エラー (オーバーフロー、0 による除算、またはドメイン エラー) が発生すると、データベース エンジンでは、SET ARITHABORT が ON に設定されている場合と同様に、これらのエラーが処理されます。残りのバッチは停止し、エラー メッセージが返されます。
行挿入の規則
行の挿入時には、次の規則が適用されます。
char、varchar、または varbinary 型の列に値が読み込まれる場合、後続の空白 (char と varchar の場合は空白、varbinary の場合は 0) の埋め込みや切り捨ては、テーブルが作成されたときに列に対して定義された SET ANSI_PADDING の設定値によって決まります。詳細については、「SET ANSI_PADDING (Transact-SQL)」を参照してください。
次の表は、SET ANSI_PADDING OFF の既定の操作を示します。データ型 既定の操作 char
定義された列幅になるように値に空白を埋めます。
varchar
空白以外の最終文字に達するまで、後続の空白を削除します。文字列が空白だけで構成されている場合は、1 つの空白文字を残して、後続の空白を削除します。
varbinary
後続の 0 を削除します。
varchar 型または text 型の列に空文字列 (' ') が読み込まれると、既定の操作では、長さが 0 の文字列が読み込まれます。
INSERT ステートメントが制約やルールに違反していたり、その値が列のデータ型と互換性を持たない場合は、ステートメントが失敗し、データベース エンジンによってエラー メッセージが表示されます。
text 列または image 列に NULL 値を挿入した場合、有効なテキスト ポインタは作成されず、また、8 KB のテキスト ページもあらかじめ割り当てられません。text データおよび image データの挿入の詳細については、「text 型、ntext 型、image 型の関数の使用」を参照してください。
INSERT が SELECT または EXECUTE で複数の行を読み込んでいる場合、読み込まれている値でルールや制約の違反が発生すると、ステートメント全体が停止し、行は読み込まれません。
データベース エンジンのリモート インスタンスでテーブルに値を挿入するとき、すべての列のすべての値が指定されている場合を除いて、指定された値をどの列に挿入するかをユーザーが指定する必要があります。
INSERT 操作での INSTEAD OF トリガの使用
テーブルやビューを対象とする INSERT 操作で INSTEAD OF トリガが定義されている場合は、INSERT ステートメントの代わりにトリガが実行されます。以前のバージョンの SQL Server では、INSERT およびその他のデータ変更ステートメントでサポートされているのは AFTER トリガのみです。INSTEAD OF トリガの詳細については、「CREATE TRIGGER (Transact-SQL)」を参照してください。
ユーザー定義型の列への値の挿入
ユーザー定義型の列に値を挿入するには、次のようにします。
そのユーザー定義型の値を指定します。
ユーザー定義型で SQL Server 2005 システム データ型からの暗黙的または明示的な変換がサポートされている場合は、そのシステム データ型の値を指定します。次の例は、文字列からの明示的な変換によって、ユーザー定義型
Point
の列に値を挿入する方法を示しています。INSERT INTO Cities (Location) VALUES ( CONVERT(Point, '12.3:46.2') );
明示的な変換を実行することなく、バイナリ値を指定することもできます。これは、すべてのユーザー定義型が、バイナリからの暗黙的な変換が可能であるためです。変換とユーザー定義型の詳細については、「ユーザー定義型に対する操作」を参照してください。
そのユーザー定義型の値を返すユーザー定義関数を呼び出します。次の例では、ユーザー定義関数
CreateNewPoint()
を使用してユーザー定義型Point
の新しい値を作成し、この値をCities
テーブルに挿入します。INSERT INTO Cities (Location) VALUES ( dbo.CreateNewPoint(x, y) );
OPENROWSET および BULK によるデータの一括読み込み
SQL Server 2005 データベース エンジンでは、OPENROWSET BULK 行セット プロバイダで新しいテーブル ヒントが使用できるようになり、INSERT ステートメントの使用時に、次に示す一括読み込みの最適化を利用できます。
- 一括読み込みログ記録 (挿入操作のログ レコード数の最小化)
- 制約チェックの ON/OFF 設定
- トリガ実行の ON/OFF 設定
これらは、BULK INSERT コマンドで使用可能な最適化と似ています。
INSERT ステートメントで空でないテーブルへの一括読み込みを実行すると、さらに次のようなパフォーマンス向上も得られます。
- 一括読み込み中にページが分割される場合、ページに追加された新しい行についての完全なログ記録は必要ありません。
- テーブルに非クラスタ化インデックスがあり、クラスタ化インデックスがない場合、個々のインデックス行については完全なログ記録が必要となる場合もありますが、データ行については必要ありません。
詳細については、「OPENROWSET (Transact-SQL)」および「テーブル ヒント (Transact-SQL)」を参照してください。
権限
対象のテーブルに対する INSERT 権限が必要です。
INSERT 権限は、既定では sysadmin 固定サーバー ロール、db_owner 固定データベース ロール、および db_datawriter 固定データベース ロールのメンバと、テーブル所有者に与えられています。sysadmin、db_owner、および db_securityadmin ロールのメンバ、およびテーブル所有者は、他のユーザーに権限を譲渡できます。
OPENROWSET 関数の BULK オプションで INSERT を実行するには、sysadmin 固定サーバー ロールまたは bulkadmin 固定サーバー ロールのメンバであることが必要です。
例
A. 単純な INSERT ステートメントを使用する
次の例では、Production.UnitMeasure
テーブルに 1 行を挿入します。すべての列の値が指定され、テーブルの列と同じ順序で並んでいるため、列名を column_list. で指定する必要はありません。
USE AdventureWorks;
GO
INSERT INTO Production.UnitMeasure
VALUES (N'F2', N'Square Feet', GETDATE());
GO
B. テーブルの列と同じ順序でないデータを挿入する
次の例では、column_list を使用して、各列に挿入する値を明示的に指定します。UnitMeasure
テーブルの列の順序は、UnitMeasureCode
、Name
、ModifiedDate
です。ただし、column_list では列がその順序で並んでいません。
USE AdventureWorks;
GO
INSERT INTO Production.UnitMeasure (Name, UnitMeasureCode,
ModifiedDate)
VALUES (N'Square Yards', N'Y2', GETDATE());
GO
C. 列数よりも少ない個数のデータを挿入する
次の例では、値が自動生成される列や既定値が設定される列を使用して、テーブルに行を挿入します。INSERT
ステートメントでは、すべての列ではなく一部の列の値を含む行を挿入します。最後の INSERT
ステートメントでは、どの列も指定されていないため、既定値のみが挿入されます。
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
CREATE TABLE dbo.T1
(
column_1 int IDENTITY,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('my column default'),
column_3 timestamp,
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
D. ID 列を持つテーブルにデータを挿入する
次の例では、ID 列にデータを挿入する方法をいくつか示します。最初の 2 つの INSERT
ステートメントで、新規の行に対して ID 値が生成されます。3 番目の INSERT
ステートメントは、SET IDENTITY_INSERT
ステートメントで設定された列の IDENTITY
プロパティを上書きし、ID 列に値を明示的に挿入します。
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
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
E. NEWID() を使用して uniqueidentifier 列にデータを挿入する
次の例では、NEWID() 関数を使用して、column_2
の GUID を取得します。ID 列とは異なり、データベース エンジンでは uniqueidentifier 型の列に対して自動的に値が生成されません。2 番目の INSERT
ステートメントを参照してください。
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
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;
GO
F. ビューを介してテーブルにデータを挿入する
次の例では、INSERT
ステートメントでビュー名を指定します。しかし、新しい行はビューの基になるテーブルに挿入されます。INSERT
ステートメントの中の VALUES
リストの順番は、ビューの列の順番に一致している必要があります。
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.T1', 'U') IS NOT NULL
DROP TABLE dbo.T1;
GO
IF OBJECT_ID ('dbo.V1', 'V') IS NOT NULL
DROP VIEW dbo.V1;
GO
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
G. SELECT および EXECUTE オプションを使用してデータを挿入する
次の例では、あるテーブルからデータを取得し、それを別のテーブルに挿入する方法を 3 種類紹介します。各方法は、列リストに式とリテラル値を含む複数のテーブルを参照する SELECT ステートメントに基づきます。
1 番目の INSERT
ステートメントでは、SELECT
ステートメントを使用して、コピー元のテーブル (Employee
、SalesPerson
、および Contact
) からデータを直接取得し、結果セットを EmployeeSales
テーブルに格納します。2 番目の INSERT
ステートメントは、SELECT
ステートメントを含むストアド プロシージャを実行します。3 番目の INSERT
ステートメントは、SELECT
ステートメントをリテラル文字列として実行します。
USE AdventureWorks;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeSales;
GO
IF OBJECT_ID ('dbo.uspGetEmployeeSales', 'P') IS NOT NULL
DROP PROCEDURE uspGetEmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
( DataSource varchar(20) NOT NULL,
EmployeeID varchar(11) NOT NULL,
LastName varchar(40) NOT NULL,
SalesDollars money NOT NULL
);
GO
CREATE PROCEDURE dbo.uspGetEmployeeSales
AS
SET NOCOUNT ON;
SELECT 'PROCEDURE', e.EmployeeID, c.LastName,
sp.SalesYTD
FROM HumanResources.Employee AS e
INNER JOIN Sales.SalesPerson AS sp
ON e.EmployeeID = sp.SalesPersonID
INNER JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.EmployeeID LIKE '2%'
ORDER BY e.EmployeeID, c.LastName;
GO
--INSERT...SELECT example
INSERT dbo.EmployeeSales
SELECT 'SELECT', e.EmployeeID, c.LastName, sp.SalesYTD
FROM HumanResources.Employee AS e
INNER JOIN Sales.SalesPerson AS sp
ON e.EmployeeID = sp.SalesPersonID
INNER JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.EmployeeID LIKE '2%'
ORDER BY e.EmployeeID, c.LastName;
GO
--INSERT...EXECUTE procedure example
INSERT EmployeeSales
EXECUTE uspGetEmployeeSales;
GO
--INSERT...EXECUTE('string') example
INSERT EmployeeSales
EXECUTE
('
SELECT ''EXEC STRING'', e.EmployeeID, c.LastName,
sp.SalesYTD
FROM HumanResources.Employee AS e
INNER JOIN Sales.SalesPerson AS sp
ON e.EmployeeID = sp.SalesPersonID
INNER JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.EmployeeID LIKE ''2%''
ORDER BY e.EmployeeID, c.LastName
');
GO
--Show results.
SELECT DataSource,EmployeeID,LastName,SalesDollars
FROM dbo.EmployeeSales;
GO
H. TOP 句を使用してデータを挿入する
次の例では、NewEmployee
テーブルを作成して、上位 10 人の従業員の住所データを Employee
テーブルから挿入します。次に SELECT
ステートメントを実行して、NewEmployee
テーブルの内容を確認します。
USE AdventureWorks;
GO
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
DROP TABLE HumanResources.NewEmployee;
GO
CREATE TABLE HumanResources.NewEmployee
(
EmployeeID int NOT NULL,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
Phone 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
INSERT TOP (10) INTO HumanResources.NewEmployee
SELECT
e.EmployeeID, c.LastName, c.FirstName, c.Phone,
a.AddressLine1, a.City, sp.StateProvinceCode,
a.PostalCode, e.CurrentFlag
FROM HumanResources.Employee e
INNER JOIN HumanResources.EmployeeAddress AS ea
ON e.EmployeeID = ea.EmployeeID
INNER JOIN Person.Address AS a
ON ea.AddressID = a.AddressID
INNER JOIN Person.StateProvince AS sp
ON a.StateProvinceID = sp.StateProvinceID
INNER JOIN Person.Contact as c
ON e.ContactID = c.ContactID;
GO
SELECT EmployeeID, LastName, FirstName, Phone,
AddressLine1, City, State, PostalCode, CurrentFlag
FROM HumanResources.NewEmployee;
GO
I. OUTPUT を INSERT ステートメントで使用する
次の例では、ScrapReason
テーブルに 1 行を挿入し、OUTPUT
句を使用してステートメントの結果を @MyTableVar
table 変数に返します。ScrapReasonID
列が IDENTITY
プロパティで定義されているため、INSERT
ステートメントではこの列の値を指定していません。ただし、データベース エンジンによってこの列用に生成された値が、OUTPUT
句で INSERTED.ScrapReasonID
列に返されます。
USE AdventureWorks;
GO
DECLARE @MyTableVar table( ScrapReasonID 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 ScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate
FROM Production.ScrapReason;
GO
J. WITH 共通テーブル式を INSERT ステートメントで使用する
次の例では、NewEmployee
テーブルを作成します。共通テーブル式 (EmployeeTemp
) で、NewEmployee
テーブルに挿入する行を定義します。INSERT
ステートメントは、共通テーブル式の列を参照します。
USE AdventureWorks;
GO
IF OBJECT_ID (N'HumanResources.NewEmployee', N'U') IS NOT NULL
DROP TABLE HumanResources.NewEmployee;
GO
CREATE TABLE HumanResources.NewEmployee
(
EmployeeID int NOT NULL,
LastName nvarchar(50) NOT NULL,
FirstName nvarchar(50) NOT NULL,
Phone 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.EmployeeID, c.LastName, c.FirstName, c.Phone,
a.AddressLine1, a.City, sp.StateProvinceCode,
a.PostalCode, e.CurrentFlag
FROM HumanResources.Employee e
INNER JOIN HumanResources.EmployeeAddress AS ea
ON e.EmployeeID = ea.EmployeeID
INNER JOIN Person.Address AS a
ON ea.AddressID = a.AddressID
INNER JOIN Person.StateProvince AS sp
ON a.StateProvinceID = sp.StateProvinceID
INNER JOIN Person.Contact as c
ON e.ContactID = c.ContactID
)
INSERT INTO HumanResources.NewEmployee
SELECT EmpID, LastName, FirstName, Phone,
Address, City, StateProvince, PostalCode, CurrentFlag
FROM EmployeeTemp;
GO
K. ID 列と計算列で OUTPUT を使用する
次の例では、EmployeeSales
テーブルを作成し、INSERT ステートメントを使用してこのテーブルに複数行を挿入します。基になるテーブルからデータを取得するため、SELECT ステートメントも使用します。EmployeeSales
テーブルには、ID 列 (EmployeeID
) および計算列 (ProjectedSales
) があります。これらの値はデータベース エンジンによって挿入操作中に生成されるため、いずれの列も @MyTableVar
で定義できません。
USE AdventureWorks ;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeSales;
GO
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 HumanResources.Employee AS e
INNER JOIN Sales.SalesPerson AS sp
ON e.EmployeeID = sp.SalesPersonID
INNER JOIN Person.Contact AS c
ON e.ContactID = c.ContactID
WHERE e.EmployeeID LIKE '2%'
ORDER BY c.LastName, c.FirstName;
SELECT LastName, FirstName, CurrentSales
FROM @MyTableVar;
GO
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales
FROM dbo.EmployeeSales;
GO
参照
関連項目
BULK INSERT (Transact-SQL)
CREATE TABLE (Transact-SQL)
DELETE (Transact-SQL)
EXECUTE (Transact-SQL)
FROM (Transact-SQL)
IDENTITY (プロパティ) (Transact-SQL)
NEWID (Transact-SQL)
SELECT (Transact-SQL)
SET ROWCOUNT (Transact-SQL)
UPDATE (Transact-SQL)