いつもお世話になっております。
RfromL.comです。
SQLServerにおいて、あるテーブルからテーブルレイアウトとデータをコピーしてバックアップテーブルとして新しいテーブルを作成する方法についてです。
1.はじめに
今回はSQLServerにおいて、あるテーブルからテーブルレイアウトとデータをコピーしてバックアップテーブルとして新しいテーブルを作成する方法についてです。
なお、使用した環境は以下のバージョンとなっています。
OS | Windows11 Home 64ビット |
DBMS | SQL 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 | |
4 | NAV | numeric | |
5 | NAV倍率 | 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.データ
テスト用テーブル「価格情報」テーブルには以下のデータを投入しておきます。
[ 投入データ ]
銘柄コード | 価格 | 利回り | NAV | NAV倍率 | 時価総額 | 出来高 | 基準年月日 |
---|---|---|---|---|---|---|---|
8991 | 99200 | 5.40 | 123268 | 0.80 | 46336 | 1885 | 20250327 |
8992 | 154500 | 3.42 | 128871 | 1.20 | 105310 | 417 | 20250327 |
9997 | 118000 | 5.55 | 123495 | 0.96 | 41532 | 1051 | 20250327 |
9998 | 116700 | 5.61 | 123495 | 0.94 | 41075 | 1585 | 20250327 |
9999 | 99300 | 5.40 | 123268 | 0.81 | 46383 | 3344 | 20250327 |
データの投入には以下のインサート文を使いました。
[データインサート文]
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上に余計なテーブルを作るわけにはいかないのでエクスポートでバックアップファイルを取っておく手段を使うことになります。
以上です。
宜しくお願い致します。