こんにちは、カヨです。
【インポート・エクスポート方法 / SSMS】
SSMS(SQL Server Management Studio)のスクリプト生成を利用したデータベースの移行方法です。データベース、テーブル、データをそのまま◎っと再現(コピー)する手順です。
✔︎これからデータベースを触りたい人
✔データベースをコピーしたり移行したい人
✔WindowsユーザーでSQL Server、SSMSを利用てる人
✔共同開発でデータベース環境を揃えて用意したい人
前提
・Windows11
・SQL Server
・SSMS(SQL Server Management Studio)導入
・移行前のデータベース
SQL Server データベース移行手順(インポート)
①インポートするたスクリプト生成画面まで移動
✔SQL serverを開く
⇒ デスクトップの検索から「SSMS」で検索 > SQL Server Management Studio > 「接続」
✔移行するデータベースを選択
⇒ 左サイドメニューの「データベース」 > < 移行するデータベース >
✔移行するデータベースのスクリプトを生成
⇒ < 移行するデータベース >を右クリック > タスク > スクリプトの生成
②スクリプトの生成
✔説明
⇒ 次へ
✔オブジェクトの選択
✔スクリプト作成オプションの設定
⇒ 詳細設定
✔スクリプト作成の詳細オプション
⇒オプション設定 > OK
※画像内の設定値は参考にしないでください。画像下の説明を読んでください。
・DROP および CREATE のスクリプトを作成:「CREATEのみ」または「DROP および CREATE」
⇒「CREATE のみ」:データベースにテーブルが存在しない場合に適用
⇒「DROP および CREATE」:移行先にすでにテーブルがある場合に上書き
・サーバーのバージョンバージョン互換のスクリプト:移行先のPCのSQL Serverに合わせる
⇒移行元と移行先が異なるバージョンの場合は移行先に合わせる。
・スクリプトを生成するデータの種類:「スキーマおよびデータ」
⇒「スキーマのみ」の設定だとテーブル構造だけ移行される(データなし)
⇒ スキーマのみ → テーブル構造だけコピー(データなし)
⇒ スキーマおよびデータ → テーブル構造 + データをコピー(今回はデータも◎)
・所有者のスクリプトを作成:False(そのままでOK)
⇒これは True にすると、ユーザー権限の問題でエラーが出ることがあるので、False のままでOK!

赤いラインの項目を上記を確認しながら決めてみてください。ほかの項目も必要があれば変更してください。
✔スクリプト 作成オプションの設定
⇒ 「スクリプト ファイルとして保存」の設定 > 次へ
✅「単一のスクリプト ファイル」
「ファイル名」:保存場所とファイル名の設定(例:test.sql)
✅名前を付けて保存:Unicode テキスト(文字化け防止)
✔ 概要
⇒ 内容の確認 > 次へ
✔ スクリプトの保存
⇒ 完了
✔ 生成されたか確認
⇒「✔スクリプト 作成オプションの設定」のファイル名で設定したパスに生成されたファイルがあるか確認。
③エンコーディングの修正
文字コードが UTF-8 ではなく、BOM付きの UTF-16 などの可能性がある場合。修正しておく。
✔ エンコードの確認方法
⇒ 「メモ」で開くと右下に出てるのがエンコードです。
もし、エンコードが「UTF-8」ではなく「UTF-16」など違えば以下の手順で修正しましょう。
✔ 文字コードを修正
⇒生成したスクリプトファイルを右クリック > メモで編集 > 名前を付けて保存
⇒ 保存設定のページ表示 > エンコード:「UTF-8」を選択 > 保存 >エンコードの修正が完了
生成したスクリプト ファイルを移行先のPCに移動

先ほどは、移行元での作業でした。ここからは移行先での作業です。先ほど生成したファイルを移行先のPCへ移動させてください。
SQL Server データベース移行手順(インポート)
ここからの作業は移行先のPCでの作業です!コピーを作るため移行先のPCのSSMS(SQL Server Management Studio)を開いて準備してください。
①SSMSで移行するデータベースを作成
✔ 作成するためのSQLクエリを実行
⇒ 新しいクエリ > データベースを作成するクエリ入力 > 「実行」ボタン
■SQLクエリ■
CREATE DATABASE [データベース名];

データベース名はつけたい名前。移行であれば移行元のものにするのがいいかと思います。
✔ データベースができているか確認
⇒ 左の「オブジェクト エクスプローラー」内、データベースの中に先ほど作成したデータベースができているはずです。

データベースの作成は完了 したので、次は 旧PCで作成した .sql ファイルを新PCにインポート(実行) して、中身を入れましょう!
②生成したクエリでインポートしてデータベースに中身を入れる
✔生成したクエリファイルの中身を移行先の設定に修正
USE [staging_db]; -- ← データベース名だけ変更
-- 以下、必要なければコメントアウト
-- IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
-- BEGIN
-- EXEC [staging_db].[dbo].[sp_fulltext_database] @action = 'enable'
-- END
-- ALTER DATABASE [staging_db] SET COMPATIBILITY_LEVEL = 150;
-- ALTER DATABASE [staging_db] SET AUTO_SHRINK OFF;
-- テーブル作成など本命の処理
CREATE TABLE ...

コメントアウト部分は基本データベース名内の設定ではなくて、オプションの設定が多く、あとから変更ができるます。コメントアウトにすることで、後々考えたり必要か調べたりできるのでお勧めです。以下、項目の詳細。データベース名だけ元のデータベース名になってるはずなので修正必須です!!
① USE [データベース名]
必須チェック!
→ 移行先のDB名に合わせて変更
→ GUIで事前にDB選んで実行するなら削除もOK
② GO の使い方
複数のバッチに分かれてると、SQL Server側はそれぞれ独立した実行として扱う
→ 依存関係がある処理(例:テーブル作成後にそのテーブルを参照するビュー作成など)は、順番に注意
③ ファイルパス・物理ファイル名(※データベース全体スクリプトのとき)
例:CREATE DATABASE に FILENAME = ‘C:\SQLData\mydb.mdf’ みたいなパスが入ってたらNG
移行先の環境とパスが違うなら、この部分は書き換え or 削除必須
④ ログイン/ユーザー定義(あれば)
CREATE USER や CREATE LOGIN などが含まれてる場合は、 → ユーザーや権限の移行が必要か確認 → 移行先にすでに同じユーザーが存在するかどうかで衝突する場合も
⑤ 外部キー/依存順
外部キー制約のあるテーブルを移す場合、 → 先に親テーブルが作成されてないとエラーになる → → SSMSのスクリプト生成ウィザードでは「依存関係順にスクリプトを生成する」オプションがあるので、チェック入れておくと安全
✔新しいクエリを実行する準備
⇒データベースを作成したものを書き直す。または、新しくクエリを作成。
👆書き直すのもOK!
✔ 先ほど修正したSQLクエリファイルを張り付ける
⇒オブジェクト エクスプローラーの横のCREATE DATABASEの部分に張り付ける。

もともとある文が残っていると、再度命令になるので削除してから張り付けましょう。
✔ クエリの実行
⇒「クエリの実行」ボタンを押す
上手くいくと上記のような表示がでて、「クエリが正常に実行されました。」とでます。エラーは赤字ででますのでその都度解決しましょう。
・(1 行処理されました) がたくさん出ている → データがしっかりインポートされた!
・最後に「クエリが正常に実行されました」と出ている → 成功!
・エラーなし! → 問題なくデータ移行完了!

もし、処理が止まらない・終わらない場合はこの最後の方に対処方法の記載もあるのでご覧ください。
✔確認作業
1️⃣ データがちゃんと入ったか確認!
USE [データベース名];
GO
SELECT COUNT(*) FROM <テーブル名>; -- 各テーブルのデータ件数をチェック
2️⃣ いくつかのデータを見てみる
SELECT TOP 10 * FROM <テーブル名>;
→ ちゃんとデータが入ってるかチェック!
3️⃣ エラーログがないかも確認(念のため)
DBCC CHECKDB;
→ データベースが破損してないかチェック!
✅ SELECT COUNT(*) でデータが入っているのを確認!
✅ DBCC CHECKDB; でエラーなし!データベースの破損なし!
✅ クエリも正常に実行完了!
お疲れ様です!
SQL Server データベース移行手順【インポート・エクスポート】完了です✨

この後は手順を紹介した際に気になったことや、さらに必要そうなことを掲載しています。
その他
✔ クエリを一旦止める方法
⇒もし長時間実行されている場合、以下の方法で一旦停止できます。
SSMSの「停止」ボタン(赤い四角)をクリック
または
✔ どのくらい待つべき?
・ 10分経過したら sp_who2 で進捗確認!
・ 30分以上続くなら KILL <SPID> で強制停止も検討!
✔ 生成したクエリの冒頭のスクリプト詳細(コメントアウト部分)
目的:互換性レベルの変更
意味:SQL Serverのバージョン互換設定(150=2019)
◇ALTER DATABASE dbname SET AUTO_SHRINK OFF;
目的:自動収縮をオフに
意味:勝手にファイルサイズが小さくならないようにする
◇ALTER DATABASE dbname SET FULLTEXT_ENABLED ON;
目的:全文検索の有効化
意味:古い構文(新しいSQLでは sp_fulltext_database を使う)
◇ALTER DATABASE dbname SET READ_ONLY;
目的:読み取り専用にする
意味:誤更新を防ぐために一時的に変更とか
◇ALTER DATABASE dbname SET SINGLE_USER;
目的:単一ユーザーに切り替え
意味:メンテナンスやリストア作業時に使う
必ず使用しなければならない記述ではないので、デフォルト設定でよければ書かなくても問題ない記述。
✔このスクリプトを移行先にそのまま流す前に注意すべきポイントを解説
① USE [データベース名]
→ 移行先にこのDBが「すでにある前提」になってます。注意!
🔧 移行先でこの名前のDBが存在しない or 別の名前を使うなら、ここは削除 or 書き換えが必要!
② FILENAME = N’C:\ProgramFiles\… のファイルパス
→ 物理ファイルの保存場所が移行元のパスのままは注意!
❗ これは移行先のSQL Serverの設定やディレクトリ構成によっては 通らずエラーになります。
🔧 一般的にはこの FILENAME は、手動でパスを書き換える or 削除してCREATE文から作り直す方が安全です。
③ ALTER DATABASE … SET COMPATIBILITY_LEVEL=150
→ これは SQL Server 2019 相当の互換性レベル。
🔧 移行先がSQL Server 2016など古いバージョンだとエラーになる可能性があります。
→ バージョン差異があるならこの行は削除 or コメントアウトしてもOK。
④ sp_fulltext_database @action=’enable’
→ これは 全文検索(Full-Text Search)機能を有効にするコマンド。
🔧 移行先に Full-Text Search がインストールされていないとエラーになります。
→ 使ってなければコメントアウトしてもOK!
✔SSMSのバージョン選択
共同開発の際に環境を合わせると質問がしやすかったり、話がスムーズに進むのでいい点もあります。しかし、とくに引継ぎのみの場面では最新のバージョンがいいと考えています。