ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

SQL Serverでテーブルのコピーを行う

今回はTips的な記事になります。SQL Serverでテーブルを丸ごとコピーしたいことがたまにあります。
たとえば、テーブルのレコードの状態を変更してちょっと検証したい!でも、既存のテーブルには影響を与えたくないといったケースです。

バックアップを取得しても良いですが、ケースによっては今回紹介する方法を使うことにより、とても簡単で楽にテーブルのコピーを取得できます。
是非試してみてください。

SELECT INTO構文でテーブルのコピーを行う

それでは、さっそくやってみましょう!

今回は、例として以下のような簡単なテーブルを準備してます。

f:id:mr_star:20210813142044p:plain
SQL Serverテーブルコピー①

データも適当なものです。

f:id:mr_star:20210813142230p:plain
SQL Serverテーブルコピー②

それでは、コピーを行います。以下構文でテーブルのコピーが行えます。
通常のSELECT文に、"INTO [コピー先テーブル名]"を付与するだけです。

SELECT * INTO [コピー先テーブル名] FROM [コピー元テーブル名]

[コピー先テーブル名]に指定した名前で、新しくテーブルが作成されます。[コピー元テーブル名]は、その名の通りコピー元のテーブル名を指定します。
それでは実際に実行してみます。

SELECT * INTO sampleDB.dbo.t2 FROM sampleDB.dbo.t1;

実行後に[コピー先テーブル名]をSELECT文で検索すると、[コピー元テーブル名]とまったく同じカラム、データが検索できました。

f:id:mr_star:20210813142839p:plain
SQL Serverテーブルコピー③

ちなみに、この方法でのテーブルコピーでは列名やデータ型、NULLを許可するかどうかはコピーされますが、インデックスや制約、トリガーなどについてはコピーされませんので注意です。もし、それらも含めてまったく同じテーブルをコピーしたい場合は別の方法を選択するか、コピー後に手動で設定する必要があります。

テーブル定義のみコピーしたい場合

データはいらないけどテーブル定義のみをコピーしたい場合もあるかもしれません。
その場合は、以下のようにすることでデータはコピーされずにテーブル定義のみがコピーされます。

SELECT * INTO [コピー先テーブル名] FROM [コピー元テーブル名] WHERE 1=2

検索条件が必ず偽となるようにすることで、コピー元テーブル名のデータは何一つ抽出されず、結果としてテーブル定義のみコピーされるということです。
便利なのでこれも覚えておくといつか役に立つかもしれません。

おわりに

いかがでしたでしょうか。意外と簡単にできてしまうので、もしかしたら使う機会もあるかもしれません。
他にもこのような便利な機能みたいのは常にキャッチアップしていきたいなと思います。
最後までお読みいただきありがとうございました。今回はこの辺で失礼いたします。