【SQL Server】既存テーブルからレイアウトとデータをコピーして新規テーブルを作成する【Select into】


いつもお世話になっております。
RfromL.comです。

SQLServerにおいて、あるテーブルからテーブルレイアウトとデータをコピーしてバックアップテーブルとして新しいテーブルを作成する方法についてです。

1.はじめに

今回はSQLServerにおいて、あるテーブルからテーブルレイアウトとデータをコピーしてバックアップテーブルとして新しいテーブルを作成する方法についてです。

なお、使用した環境は以下のバージョンとなっています。

OSWindows11 Home 64ビット
DBMSSQL Server 2019
統合環境SQL Server Management Studio v18.10

2.select into の構文

構文は以下の通りです。

Select * into テーブルB From テーブルA

[テーブルA]がコピー元となる既存テーブル
[テーブルB]がコピー先として新規作成するテーブル

注意点としては、レイアウトとデータのコピーは行われますがKEY情報についてはコピーされなません。
コピー先のテーブルにもKEY情報が欲しい場合は、別途「ALTER TABLE」でKEY情報を付与する必要があります。

今回はコピー元テーブルとして[価格情報]というテーブルを用意。
コピー先は[価格情報_BK20250409]というテーブル名で新規作成します。
この場合のSQL文が以下の通りとなります。

Select * into 価格情報_BK20250409 From 価格情報

3.テスト環境

テスト用に用意したテーブルとテーブルデータの情報です。

3-1.テーブル

テスト用に作成したテーブルは「価格情報」テーブルです。

[ 価格情報 ]

No項目名データ型KEY
1銘柄コードchar
2価格numeric
3利回りnumeric
4NAVnumeric
5NAV倍率numeric
6時価総額numeric
7出来高numeric
8基準年月日char

[テーブルクリエイト文]

CREATE TABLE [dbo].[価格情報](
  [銘柄コード] [char](4) NOT NULL,
  [価格] [numeric](18, 0) NOT NULL,
  [利回り] [numeric](9, 2) NOT NULL,
  [NAV] [numeric](12, 0) NOT NULL,
  [NAV倍率] [numeric](9, 2) NOT NULL,
  [時価総額] [numeric](12, 0) NOT NULL,
  [出来高] [numeric](12, 0) NOT NULL,
  [基準年月日] [char](8) NOT NULL,
PRIMARY KEY CLUSTERED
(
  [銘柄コード] ASC,[基準年月日] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

3-2.データ

テスト用テーブル「価格情報」テーブルには以下のデータを投入しておきます。

[ 投入データ ]

銘柄コード価格利回りNAVNAV倍率時価総額出来高基準年月日
8991992005.401232680.8046336188520250327
89921545003.421288711.2010531041720250327
99971180005.551234950.9641532105120250327
99981167005.611234950.9441075158520250327
9999993005.401232680.8146383334420250327

データの投入には以下のインサート文を使いました。

[データインサート文]

insert into 価格情報 values(8991,99200,5.40,123268,0.80,46336,1885,20250327);
insert into 価格情報 values(8992,154500,3.42,128871,1.20,105310,417,20250327);
insert into 価格情報 values(9997,118000,5.55,123495,0.96,41532,1051,20250327);
insert into 価格情報 values(9998,116700,5.61,123495,0.94,41075,1585,20250327);
insert into 価格情報 values(9999,99300,5.40,123268,0.81,46383,3344,20250327);

4.実行

①コピー元テーブルの情報を確認

②select-intoを実行してテーブルをコピーします。
実行するSQL文は以下の通りです。

[ SQL文 ]

Select * into 価格情報_BK20250409 From 価格情報

[ 実行結果 ]

③コピー先の新規テーブル「価格情報_BK20250409」の内容を確認します。
コピー元と同様のデータが投入されていることを確認します。

コピー元と同様のレイアウトとなっていることを確認します。

5.おわりに

select-intoの用途(私の場合)は、開発環境上でSQLパッチのテストをする際に更新前の状態として、テーブルデータをバックアップしておく時に使用していました。

エクスポートでダンプファイルを取っておくのもひとつの方法ですが、開発環境なら今回の方法を使うこともありました。

ただし、本番環境では、DB上に余計なテーブルを作るわけにはいかないのでエクスポートでバックアップファイルを取っておく手段を使うことになります。

以上です。
宜しくお願い致します。


タイトルとURLをコピーしました