SQL Serverで「改行ありの文字列」を含んだテーブルデータを移行する - ROBOT PAYMENT TECH-BLOG

ROBOT PAYMENT TECH-BLOG

株式会社ROBOT PAYMENTのテックブログです

SQL Serverで「改行ありの文字列」を含んだテーブルデータを移行する

こんにちは、ペイメントシステム課の大倉です。 今回は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