Code for final

ふぁいなる向けのコード置き場です。すでにコードじゃないこともいっぱい。

Windows10が通常起動しなくなった場合でも「ドライバー署名の強制を無効にする」か「起動時マルウェア対策を無効にする」で起動できることがある。

ついこないだWindows10が突然起動しなくなりました。

原因不明でいろいろとググりにググりまくっていろいろと調べてありとあらゆる修復方法を試みましたが、
修復できなかったときにふと以下の起動オプションを実行することで起動できることがありました。

これはググったときに載ってなかったので、記しておきます。

ちなみに僕が発生したときのエラーは「CRITICAL_SERVICE_FAILED」でした。

セーフモードで起動しようとしたときに並列に以下のオプションがあると思います。どちらかを選択して起動するか確かめてください。
Windows10が起動しなくなったときにいろんなリカバリをしていてその後の状態によってどっちで起動するかは異なりました。

「ドライバー署名の強制を無効にする」

「起動時マルウェア対策を無効にする」

詳細な手順は以下のページを確認してください。

Windows10/8.1をセーフモードで起動する方法とセーフモードでPCを復旧する方法 - ぼくんちのTV 別館

原因によっては起動できないこともあると思いますが、「ドライバー署名の強制を無効にする」か「起動時マルウェア対策を無効にする」のどちらかを選択することでいとも簡単に起動することができました。

再起動するとまた自動修復になって起動しなくなるので起動オプションで同じものを選択すればまた起動します。

この起動プションを選択することでみなさんのWindowsが起動できることを祈っています。

SQL Serverでselectした結果のデータをinsert文としてSQLでエクスポートする方法。

SQLでselectしたデータをinsert文として出力したいときがあると思います。
初期データとしていれたデータを構築時にSQL流すだけで構築できるようにしたい場合とかです。

OracleSQL 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年前ほどのバージョンを使っているかというと顧客指定だからです