INSERT

テーブルまたはビューに新しい行を追加します。

構文

INSERT [INTO]
    
{ table_name WITH ( < table_hint_limited > [ ...n ] )
        |
view_name
    
    | rowset_function_limited
    }

    {    [
( column_list ) ]
        
{ VALUES
            
( { DEFAULT | NULL | expression } [ ,...n] )
            
| derived_table
            
| execute_statement
        }
    }
    | DEFAULT VALUES

< table_hint_limited > ::=
    
{ FASTFIRSTROW
        |
HOLDLOCK
        | PAGLOCK
        | READCOMMITTED
        | REPEATABLEREAD
        | ROWLOCK
        | SERIALIZABLE
        | TABLOCK
        | TABLOCKX
        | UPDLOCK
    }

引数

[INTO]

INSERT キーワードと対象のテーブルとの間で使用できるキーワードで、省略可能です。

table_name

データを受け取るテーブルまたは table 変数の名前です。

WITH (<table_hint_limited> [...n])

対象のテーブルに設定可能なテーブル ヒントを指定します。キーワード WITH とかっこが必要になります。READPAST、NOLOCK、および READUNCOMMITTED は指定できません。テーブル ヒントの詳細については、「FROM」を参照してください。

view_name

ビューの名前および別名です。別名は省略可能です。view_name が参照するビューは、更新可能でなければなりません。INSERT ステートメントを使用して加えた変更が、ビュー内の FROM 句で参照されている複数のベース テーブルに影響を与えることはありません。たとえば、複数のテーブルを参照するビューに対して INSERT を実行するには、単一ベース テーブルの列のみを参照する column_list を使用する必要があります。更新可能なビューの詳細については、「CREATE VIEW」を参照してください。

rowset_function_limited

OPENQUERY 関数または OPENROWSET 関数を指定します。詳細については、「OPENQUERY」および「OPENROWSET」を参照してください。

(column_list)

データを追加する 1 つ以上の列で構成されるリストです。column_list はかっこで囲み、カンマで区切る必要があります。

列が column_list にない場合、Microsoft® SQL Server™ は列の定義に基づいて値を設定できる必要があります。値を設定できない場合は行をロードできません。SQL Server は、列が次の条件を満たす場合、自動的に列に値を設定します。

  • IDENTITY プロパティを持っている。増分された次の ID 値が使用されます。

  • 既定値を持っている。列の既定値が使用されます。

  • timestamp 型である。現在のタイムスタンプ値が使用されます。

  • NULL 値を許容している。NULL 値が使用されます。

ID 列に値を明示的に追加するときには、column_list と VALUES リストを使用する必要があります。また、テーブルの SET IDENTITY_INSERT オプションは ON でなければなりません。

VALUES

追加するデータ値のリストを示します。column_list (指定されている場合) またはテーブル内の各列ごとに 1 つのデータ値が必要です。VALUES リストは、かっこで囲む必要があります。

VALUES リスト内の値がテーブル内の列と同じ順序で並んでいない場合、またはテーブル内のすべての列に対応していない場合、column_list を使用して、各入力値を格納する列を明示的に指定する必要があります。

DEFAULT

SQL Server が、列に対して定義されている既定値を読み込むことを指定します。既定値がなく、しかも NULL が許可されている列には、NULL が挿入されます。timestamp 型が定義されている列には、次のタイムスタンプ値が挿入されます。DEFAULT は ID 列には有効ではありません。

expression

定数、変数、または式です。式に SELECT ステートメントまたは EXECUTE ステートメントを含めることはできません。

derived_table

テーブルに読み込まれるデータの行を返す、有効な SELECT ステートメントです。

execute_statement

SELECT ステートメントまたは READTEXT ステートメントでデータを返す有効な EXECUTE ステートメントです。

INSERT で execute_statement を使用する場合、各結果セットは、テーブルまたは column_list 内の列と互換性がなければなりません。execute_statement を使用して、同じサーバーまたはリモート サーバー上でストアド プロシージャを実行できます。リモート サーバーのプロシージャが実行されると、結果セットがローカル サーバーに返され、ローカル サーバーのテーブルに読み込まれます。execute_statement が READTEXT ステートメントでデータを返す場合は、各 READTEXT ステートメントは最高で 1MB (1024K) のデータを返すことができます。execute_statement は拡張プロシージャも使用でき、拡張プロシージャのメイン スレッドによって返されるデータを追加します。メイン スレッド以外のスレッドからの出力は挿入されません。

  SQL Server Version 7.0 では、text または image 列を返す拡張ストアド プロシージャを execute_statement に含めることはできません。この動作は、以前のバージョンの Microsoft SQL Server から変更された点です。

DEFAULT VALUES

新しい行が、各列に対して定義されている既定値で構成されることを指定します。

解説

INSERT は、テーブルに新しい行を追加します。テーブル内のデータを置換するには、DELETE ステートメントまたは TRUNCATE TABLE ステートメントを使用して既存のデータを消去してから、INSERT で新しいデータを読み込む必要があります。既存の行の任意の列の値を変更するには UPDATE を使ってください。テーブルを新規作成し、これにデータを読み込むという操作を 1 回の手順で行うには、SELECT ステートメントの INTO オプションを使用します。

table 変数は、その有効範囲の中で、通常のテーブルのようにアクセスできます。このため、table 変数を、INSERT ステートメントで行を追加するテーブルとして使用できます。詳細については、「table」を参照してください。

サーバー名要素として OPENDATASOURCE 関数を使用する 4 つの要素で構成される名前は、INSERT ステートメント内でテーブル名を指定できるすべての位置で、テーブル ソースとして使用できます。

uniqueidentifier 型で作成される列は、特別にフォーマットされた 16 バイトのバイナリ値を格納します。ID 列の場合とは異なり、SQL Server は、uniqueidentifier 型の列に対して自動的に値を生成しません。挿入操作の際、uniqueidentifier 列には、uniqueidentifier 型の変数と、xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (ハイフンを含む 36 文字で、x は 0-9 または a-f の範囲の 16 進数値) という形式の文字列定数を使用できます。たとえば、uniqueidentifier 変数または列には、6F9619FF-8B86-D011-B42D-00C04FC964FF という値を指定できます。GUID を取得するには、NEWID() 関数を使用します。

行を挿入する場合、次の規則が適用されます。

  • charvarchar、または varbinary 型の列に値が読み込まれる場合、後続の空白 (charvarchar の場合は空白、varbinary の場合は 0) の埋め込みや切り捨ては、テーブルが作成されたときに列に対して定義された SET ANSI_PADDING の設定値によって決まります。詳細については、「SET ANSI_PADDING」を参照してください。

    次の表は、SET ANSI_PADDING が OFF の場合の既定の操作を示します。

    データ型 既定の操作
    Char 定義された列幅になるように値に空白を埋めます。
    Varchar 空白以外の最終文字に達するまで、後続の空白を削除します。文字列が空白だけで構成されている場合は、1 つのスペース文字を残して、後続の空白を削除します。
    Varbinary 後続の 0 を削除します。

  • varchar 型または text 型の列に空文字列 (' ') が読み込まれると、既定の操作では、長さが 0 の文字列が読み込まれます。データベースの互換性レベルが 70 より低い場合、値は 1 つの空白に変換されます。詳細については、「sp_dbcmptlevel」を参照してください。

  • INSERT ステートメントが制約やルールに違反していたり、その値が列のデータ型と互換性を持たない場合は、ステートメントが失敗し、エラー メッセージが表示されます。

  • text 型列または image 型列に NULL 値を挿入した場合、有効なテキスト ポインタは作成されず、また、8KB のテキスト ページもあらかじめ割り当てられません。text 型データと image 型データの詳細については、「」を参照してください。

  • INSERT が SELECT または EXECUTE で複数の行を読み込んでいる場合、読み込まれている値でルールや制約の違反が発生すると、ステートメント全体が終了し、行は読み込まれません。

  • リモート SQL Server のテーブルに値を挿入するとき、すべての列のすべての値が指定されている場合を除いて、指定された値をどの列に挿入するかをユーザーが指定する必要があります。

SET ROWCOUNT オプションの設定は、ローカルおよびリモート分割ビューに対する INSERT ステートメントにおいて無視されます。また、互換性レベルが 80 に設定されている場合、SQL Server 2000 のリモート テーブルに対する INSERT ステートメントでは、このオプションはサポートされません。

テーブルやビューを対象とする INSERT 操作で INSTEAD-OF トリガが定義されている場合は、INSERT ステートメントの "代わりに" トリガが実行します。以前のバージョンの SQL Server では、INSERT およびその他のデータ変更ステートメントでサポートされているのは AFTER トリガのみです。

INSERT ステートメントの中で、式の評価中に算術エラー (オーバーフロー、0 による除算、またはドメイン エラー) が発生すると、SQL Server はこれらのエラーを SET ARITHABORT が ON に設定されているかのように処理します。残りのバッチは停止し、エラー メッセージが返されます。

権限

INSERT 権限は、特に指定のない限り固定サーバー ロール sysadmin、固定データベース ロール db_owner、および固定データベース ロール db_datawriter のメンバと、テーブル所有者に与えられます。ロール sysadmindb_owner、および db_securityadmin のメンバとテーブル所有者は、権限をほかのユーザーに譲渡できます。

A.    単純な INSERT を使用する

この例では、T1 というテーブルを作成し、1 行を追加します。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
INSERT T1 VALUES (1, 'Row #1')
B.    列と同じ順序でないデータを追加する

この例では、column_list と VALUES リストを使用して、各列に挿入する値を明示的に指定します。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
INSERT T1 (column_2, column_1) VALUES ('Row #1',1)
C.    列数よりも少ない個数のデータを追加する

この例では、4 つの列で構成されるテーブルを作成します。次に、INSERT ステートメントで、すべての列ではなく一部の列の値を含む行を挿入します。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE TABLE T1
( column_1 int identity,
  column_2 varchar(30)
    CONSTRAINT default_name DEFAULT ('column default'),
  column_3 int NULL,
  column_4 varchar(40)
)
INSERT INTO T1 (column_4)
   VALUES ('Explicit value')
INSERT INTO T1 (column_2,column_4)
   VALUES ('Explicit value', 'Explicit value')
INSERT INTO T1 (column_2,column_3,column_4)
   VALUES ('Explicit value',-44,'Explicit value')
SELECT *
FROM T1
D.    ID 列を持つテーブルにデータを読み込む

最初の 2 つの INSERT ステートメントで、新規の行に対して ID 値が生成されます。3 番目の INSERT ステートメントは、SET IDENTITY_INSERT ステートメントで設定された列の IDENTITY プロパティを上書きし、ID 列に値を明示的に挿入します。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int IDENTITY, column_2 varchar(30))
INSERT T1 VALUES ('Row #1')
INSERT T1 (column_2) VALUES ('Row #2')
SET IDENTITY_INSERT T1 ON
INSERT INTO T1 (column_1,column_2)
   VALUES (-99,'Explicit identity value')
SELECT *
FROM T1
E.    ビューを介してのテーブルへのデータを読み込む

この例の INSERT ステートメントはビュー名を指定します。しかし、新しい行はビューの基になるテーブルに挿入されます。INSERT ステートメントの中の VALUES リストの順番は、ビューの列の順番に一致している必要があります。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
      WHERE TABLE_NAME = 'V1')
   DROP VIEW 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)
SELECT *
FROM T1
F.    DEFAULT VALUES オプションを使用してデータを読み込む

この例の CREATE TABLE ステートメントは、各列を値と共に定義します。その値は、INSERT ステートメントで列の値が明示的に指定されない場合に使用されます。INSERT ステートメントの DEFAULT VALUES オプションは、値を明示的に指定せずに行を追加するときに使用します。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'T1')
   DROP TABLE T1
GO
CREATE DEFAULT bound_default AS 'Bound default value'
GO
CREATE TABLE T1
( column_1 int identity,
  column_2 varchar(30)
    CONSTRAINT default_name DEFAULT ('column default'),
  column_3 timestamp,
  column_4 varchar(30),
  column_5 int NULL)
GO
USE master
EXEC sp_bindefault 'bound_default','T1.column_4'
INSERT INTO T1 DEFAULT VALUES
SELECT *
FROM T1
G.    SELECT および EXECUTE オプションを使用してデータを読み込む

この例では、あるテーブルから値を取得し、それを別のテーブルに読み込む方法を 3 種類紹介します。各方法は、列リストに式とリテラル値を含む複数のテーブルを参照する SELECT ステートメントに基づきます。

1 番目の INSERT ステートメントでは、SELECT ステートメントを使用して authors というコピー元のテーブルからデータを直接取得し、結果セットを author_sales テーブルに格納します。2 番目の INSERT ステートメントは、SELECT ステートメントを含むプロシージャを実行します。3 番目の INSERT ステートメントは、SELECT ステートメントをリテラル文字列として実行します。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'author_sales')
   DROP TABLE author_sales
GO
IF EXISTS(SELECT name FROM sysobjects
      WHERE name = 'get_author_sales' AND type = 'P')
   DROP PROCEDURE get_author_sales
GO
USE pubs
CREATE TABLE author_sales
( data_source   varchar(20),
  au_id         varchar(11),
  au_lname      varchar(40),
  sales_dollars smallmoney
)
GO
CREATE PROCEDURE get_author_sales
AS
   SELECT 'PROCEDURE', authors.au_id, authors.au_lname,
      SUM(titles.price * sales.qty)
   FROM authors INNER JOIN titleauthor
      ON authors.au_id = titleauthor.au_id INNER JOIN titles
      ON titleauthor.title_id = titles.title_id INNER JOIN sales
      ON titles.title_id = sales.title_id
   WHERE authors.au_id like '8%'
   GROUP BY authors.au_id, authors.au_lname
GO
--INSERT...SELECT example
USE pubs
INSERT author_sales
   SELECT 'SELECT', authors.au_id, authors.au_lname,
      SUM(titles.price * sales.qty)
   FROM authors INNER JOIN titleauthor
      ON authors.au_id = titleauthor.au_id INNER JOIN titles
      ON titleauthor.title_id = titles.title_id INNER JOIN sales
      ON titles.title_id = sales.title_id
   WHERE authors.au_id LIKE '8%'
   GROUP BY authors.au_id, authors.au_lname

--INSERT...EXECUTE procedure example
INSERT author_sales EXECUTE get_author_sales

--INSERT...EXECUTE('string') example
INSERT author_sales
EXECUTE
('
SELECT ''EXEC STRING'', authors.au_id, authors.au_lname,
   SUM(titles.price * sales.qty)
   FROM authors INNER JOIN titleauthor
      ON authors.au_id = titleauthor.au_id INNER JOIN titles
      ON titleauthor.title_id = titles.title_id INNER JOIN sales
      ON titles.title_id = sales.title_id
   WHERE authors.au_id like ''8%''
   GROUP BY authors.au_id, authors.au_lname
')

--Show results.
SELECT * FROM author_sales
H.    SELECT ステートメントの TOP 句を使用してデータを追加する

INSERT ステートメントの中で SELECT ステートメントを指定できるので、SELECT ステートメントの中で TOP 句を指定することもできます。この例では、authors テーブルの先頭の 10 人の著者を、new_authors という新しいテーブルに追加します。

IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'new_authors')
   DROP TABLE new_authors
GO
USE pubs
CREATE TABLE new_authors
(
 au_id    id,
 au_lname varchar(40),
 au_fname varchar(20),
 phone    char(12),
 address  varchar(40),
 city     varchar(20),
 state    char(2),
 zip         char(5),
 contract bit
)
INSERT INTO new_authors
SELECT TOP 10 *
FROM authors

関連項目

CREATE TABLE

EXECUTE

FROM

IDENTITY (プロパティ)

NEWID

SELECT

SET ROWCOUNT

表示: