PowerShellでテーブルCreateスクリプトを出力

2020年3月3日火曜日

シリーズ目次

前置き

SQLSERVERでは下図のように、メニューからテーブルのCreateスクリプトを出力することができます。
データベース>(出力したいテーブルがあるデータベース)を右クリック>タスク>スクリプトの生成
しかし、Gitでソース管理するときに、こんなの毎回画面からやってたらめんどくさくてしょうがないのです。
コマンド一発で出せるようにしておきたいのです。

PowerShellでテーブルCreateスクリプトを出力

んで調べてみたところ、Microsoftさんはちゃんと用意してくれてました。
https://docs.microsoft.com/ja-jp/sql/relational-databases/server-management-objects-smo/tasks/scripting?view=sql-server-ver15

今回はPowerShellでやってみます、といってもほぼ写経ですがw
cd C:\data_converter
$strServer = $env:COMPUTERNAME + "\SQLEXPRESS"
$server = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Server($strServer);
$db = $server.Databases["data_convert_from"]
$scripter = New-Object -TypeName Microsoft.SqlServer.Management.Smo.Scripter
$scripter.Server = $server
$scripter.Options.ToFileOnly = $true
$scripter.Options.AnsiPadding = $true
foreach ($table in $db.Tables)
{
$filePath = "C:\data_converter\" + $table.Name + ".sql"
$scripter.Script($table) > $filePath
}
この「Scripter」ってやつは、そのまま実行するとcreate文だけが帰ってきます。それを書き出しただけです。

Scripterの引数には各tableオブジェクトを突っ込むのですが、SMOからdatabaseオブジェクトを経由して、tablesオブジェクトを取得できます。あとはforeachで回すだけ。

できあがったファイルを見てみましょう。
Accessテーブルをインポートしたまんまなので、テーブル定義自体はかなり適当になっちゃってますが、んーちゃんとできてますね!

ちなみにC#でも同様のことができ、実務ではそちらを使いました。DLLにしてpowershellから実行です。
C#、VBA、powershellあたりは、すべて使い回しが効くから便利ですね!!