こんにちは、ペイメントシステム課の大倉です。 今回はSQL Serverのテーブルのデータ移行で「改行ありの文字列」に悩んだお話です。
コトの発端はテーブルのレコードを別環境に移行するときのこと。
1. SSMSでA環境でテーブルのSELECTクエリの結果をファイルに保存する
2. SSMSでB環境に接続して、A環境で保存したSELECTの結果をファイルからテーブルに貼り付ける
といった単純な作業を行った際に「あれ?改行が消えている?」となってしまったので、調査したものです。
今回は「SQL Server Management Studio 19.1」を使用します。
SSMSのデフォルト設定ではクエリ結果の「改行」をコピーできない
SSMSのデフォルトの設定では「コピーまたは保存時に CR/FL を保持」がオフになっています。
カラムの値がこのように「改行あり文字列」だと・・・
1行目<改行> 2行目<改行> <改行> 4行目
クエリの実行結果はこのようになり、
クエリの結果をコピーすると、
改行が削除されてコピーされます。
SSMSのクエリ結果で「改行」をコピーできるようにする
ではクエリ結果をコピーする際に改行もコピーするためにはどうすれば良いか?
そうです、前述のオプション「コピーまたは保存時に CR/FL を保持」をオンにすれば良いのです。
「コピーまたは保存時に CR/FL を保持」をオンにしたら、SSMSを再起動します。
(再起動しないとオプションの変更が適用されない場合があります)
その後、先ほどと同様にクエリの結果をコピーすると、
「改行あり」でコピーされます。
データ移行はINSERTで行うのが楽
最初に記載した手順、
1. SSMSでA環境でテーブルのSELECTクエリの結果をファイルに保存する
2. SSMSでB環境に接続して、A環境で保存したSELECTの結果をファイルからテーブルに貼り付ける
このうち、1 では「改行あり文字列」をファイルに保存することができました。
しかし、2 では「改行あり文字列」を含むレコードをそのままテーブルに貼り付けることができません。
(改行までを1レコードと判断されるので当然といえば当然なのですが・・)
結局はレコードのコピー&ペーストではなく、テーブルからINSERTスクリプトを作成してデータ移行するのが改行に左右されず良さそうです。
既存テーブルに登録されたレコードのINSERTスクリプトを作成する手順を以下に記載します。
データベースを右クリックして「タスク」→「スクリプトの生成」を選択します。
「スクリプトの生成」画面が表示されるので、「次へ」をクリックします。
対象のオブジェクト(テーブル)を選択して、「次へ」をクリックします。
「詳細設定」をクリックします。
オプションの「スクリプトを生成するデータの種類」で「データのみ」(または「スキーマとデータ」)を選択します。
あとは、スクリプトの保存方法を指定して、「次へ」をクリックします。
設定した内容を確認して「次へ」を押します。
スクリプトの保存が完了するまで待ちます。
以下のようなスクリプトが出力されます。
USE [TestDB] GO INSERT [dbo].[tbl_test] ([ID], [Column_1]) VALUES (1, N'1行目 2行目 4行目') GO
あとは、スクリプトを移行先の環境で実行すればデータを移行できます。
テーブルデータの移行はINSERTスクリプトを作成する方が悩まずにできて簡単でしたね!
We are hiring!!
ROBOT PAYMENTでは一緒に働く仲間を募集しています!!!
speakerdeck.com
www.robotpayment.co.jp