SQL Server - SELECT結果を使用してテーブルを作成する

通常、新しいテーブルを作成してレコードを追加する場合、まず CREATE TABLE を実行してから INSERT を行います。しかし、INTO 句を使用すると、SELECT の結果を元に新しいテーブルを直接作成できます。

SELECT結果を使用してテーブルを作成する方法

SELECT *
       INTO [新しいテーブル名]
       FROM [既存のテーブル名]
       WHERE [条件]

SELECT文 で INTO句 を使用すると、指定した名前で 新しいテーブル が作成され、検索結果が そのテーブル にコピーされます。 列のデータ型は元のテーブルから引き継がれますが、主キー、インデックス、トリガー、NOT NULL 以外の制約などは引き継がれません

次の SQL は テーブル SampleTable2 を作成し、テーブル SampleTable1 のレコードを 全件 INSERT します。

SELECT *
      INTO SampleTable2
      FROM SampleTable1

列名を変更する

列名を変更するには、AS 句を使用して 列 の名称を指定します。
SELECT  [既存テーブルの列名] AS [新しい列名]
       ,[既存テーブルの列名] AS [新しい列名]
       ...
       INTO [新しいテーブル名]
       FROM [既存のテーブル名]

次の SQLは 列 UserName の名前を AccountName に変更しています。

SELECT UserName AS AccountName
  INTO SampleTable2
  FROM SampleTable1

リテラル値(文字列や数値など)の挿入

INTO句を使用する場合、列名が無いとエラーとなります。リテラル は列名を持たないため、AS 句を使用して列名を付ける必要があります。 列の型は リテラル の型が引き継がれますが、NULL の場合は int型 になります。

次の SQL は 列 UserName と 列 Age を持つ、SampleTable テーブル を作成します。 列のデータ型は UserName列 が varchar(10)、 Age列 が int です。 新しいテーブルには 1 レコード('1234567890', NULL) 追加されます。

SELECT '1234567890' AS UserName
      ,NULL        AS Age
  INTO SampleTable

次の SQL は SampleTable1 テーブル の 全ての列 に加え、Version列 を持つ、SampleTable2 テーブルを作成します。Version列の値は、全ての行で 1 となります。

SELECT *
      ,1    AS Version
      INTO SampleTable2
      FROM SampleTable1

型を明示的に指定

CAST関数 または CONVERT関数 を使用して型変換を行います。 通常 NULLリテラル の場合は int型 になりますが、別の型にしたい場合にはこの方法を用います。

次に CAST関数 を使用し、型を明示的に指定する SQL を示します。

SELECT CAST('1234567890' AS VARCHAR(256)) AS UserName
      ,CAST(NULL AS DECIMAL(10,1))        AS Age
 INTO SampleTable

次の SQL は CAST関数 の代わりに CONVERT関数 を使用しています。

SELECT CONVERT(VARCHAR(256), '1234567890') AS UserName
      ,CONVERT(DECIMAL(10,1), NULL)        AS Age
 INTO SampleTable

INTO句 使用時の注意点

元のテーブルから引き継がれないもの

主キー、インデックス、トリガー、NOT NULL 以外の制約 は引き継がれません。

検索結果が 0件 の場合

新しいテーブルは作成されますが、レコードは挿入されません。

既に同名のテーブルが存在する場合

エラーが発生します。テーブルの再作成や、レコードの挿入は行われません。

参考資料

検証環境