SQL Serverでselectした結果のデータをinsert文としてSQLでエクスポートする方法。
SQLでselectしたデータをinsert文として出力したいときがあると思います。
初期データとしていれたデータを構築時にSQL流すだけで構築できるようにしたい場合とかです。
OracleのSQL Developerの感覚でManagement Studioでエクスポートしようとしたらできないところから始まりました。
Oracleだと結果をエクスポートって簡単にできます。結果のグリッドでエクスポートを選んでクリップボードにinsert文を出力するとか朝飯前です。
そんな感じでOracleに慣れていたのでManagement Studioで結果のグリッドを選んでもファイル出力しかできません。
そこで調べるとManagement Studioにはスクリプトの生成という機能があり、テーブルからinsert文を生成してくれるというドンピシャな機能がありました。
これだ!と思いウィザードを進めると条件を入力するところがありません。。
そうです。テーブルの全データしか出力できないんです。
大は小を兼ねるということでこれで事足りるときもありますが、一部データを出力したいときもありますがな。
これはどうすっかなーと小一時間考えて思いつきました。
一時的にテーブルに作るしかないと。
幸いSQLとは便利なものでintoを使うと簡単にテーブルを作れます。
以下のような感じのSQLで。
select * into temp_hogehoge from hogehoge where col = 'xxxx'
で、この一時的なテーブルをManagement Studioでスクリプト生成すれば完成です。
ちなみに詳細設定でデータのみにすることを忘れずに。
クリップボードにも出せます。
まとめると、SQLServerでselectした結果のデータをinsert文としてSQLでエクスポートしたい場合は、select intoで一時テーブルを作ってスクリプト生成するべし。
ちなみにこの方法はSQL Server 2008*1での話なので、最新バージョンではOracleみたいにできるようになっているかもしれません。いや、きっとできるはず。
この方法を思いつくのに意外と時間かかったので忘れないように記録しておきます。
*1:なんでこんな10年前ほどのバージョンを使っているかというと顧客指定だからです
SQL ServerにCSVファイル or Excelファイルからデータをインポートする際に注意(NOT NULLと改行)すること。
SQL Serverで開発システムの場合、テスト環境を構築する際に手っ取り早くデータをいれるときはManagement Studioのデータインポート機能を使うと思います。
そこで久々に使ったんですけど、ちょっとはまったので今後も忘れないように記録しておきます。
たいていは設計時にねたをExcelにまとめていると思うのでそこからデータインポートすると思います。
その際、Excelをそのまま入れるかCSV(フラットファイル)にして入れるかでそれぞれ注意するべきところが違うことが分かりました。
Excelファイルをインポート
NOT NULLの項目にはそのまま入らない。
varcharなどでNOT NULL制約があるカラムに対してExcelのセルが空欄のままだとNULLをいれるようとしてこけます。
この場合、空欄セルにデータで使われていない文字(★など)をいれといて入れた後にupdateで空文字にしましょう。
以下のようなSQLです。
update hogehoge set col = '' where col = '★'
セルに改行があるとそのまま入らない。
セル内に改行があると失敗します。
この場合、Excelで改行をまずデータで使われていない文字(■など)に置換して入れた後に改行に置換します。
Excelの改行コードは置換のときにCtrl+Jキーを押すと入力できます。見えませんけど。
以下のようなSQLです。
update hogehoge set col = replace(col, '■', CHAR(13) + CHAR(10))
CSVに比べてエラーメッセージが不親切
な気がします。なのでエラーメッセージが何を言っているかわからない場合はCSVインポートに切り替えてみるのも一つの手です。
CSVでもそれほど親切なエラーメッセージはでませんが。
CSVファイルをインポート
セルに改行があるとそのまま入らない。
CSVでもこれは同じです。
50文字以上ある場合そのまま入らない。
1項目が50文字以上あるはCSV取り込み時の詳細設定で文字数を変更する必要があります。
なぜかデフォルトすべて50になってました。
これに気付かずにテーブルより桁数が少ないのに切り捨てましたみたいなエラーがでてはまりました。
まとめ
上記のような感じなのでおすすめは50文字以上のデータがあるテーブルはExcelで、それ以外はCSVで試して最終的にだめならCSVでエラーをつぶす。ですがね。
ちなみにこれはSQL Server 2008*1の場合ですので最近のバージョンだと違うかもしれません。というか改善されていてほしい。
*1:なんでこんな10年前ほどのバージョンを使っているかというと顧客指定だからです
JenkinsでビルドしてCheckstyleでエラーになることがあることを初めて知った日。
Javaで開発していてJenkinsでビルドを自動化している環境ならついでにCheckstyleで静的解析でもしておくかーみたいな感じで、 ついてくると思います。
仕事で提供されたJenkinsの環境もその一つでした。
で、いままでJenkinsのビルドが通っていたのにあるプルリクエストをマージしてから失敗するようになりました。
原因を見るとCheckstyleのところでfailとでている。
Checkstyleでfail???
僕みたいなにわかJava使いはCheckstyleは静的解析して警告だけ出してくれるものと思ってたのでこのエラーは意味不明でした。
これを機に調べるとCheckstyleもレベルがあって"error"と"warning"と"info"があるみたいですね。
Javaのプロジェクト結構やってますが、初めて知りました。
だいたいCheckstyleの定義ファイルは上から降ってきますからね。新規開発でも過去のを流用したり。
定義ファイルまで書けるようになる必要はないでしょう。
なので僕みたいにCheckstyleをなんとなく使っているひとはCheckstyleにはレベルがあり、CIでエラーにすることもできる。とだけ覚えておきましょう。
ちなみに今回の件は、JavaでよくやりがちなStringを==比較しているのがerrorレベルでした。修正したら通るようになりました。
僕がコーディングしたわけではないですが、.NETerはやっちゃいますよね。気持ちはわかります。