SQL Server 2008へSQLをたたいて結果を得る。

SQL Server2008をインストールすると、専用のスナップインがインストールされて利用できるようになる。このスナップインに含まれる Invoke-Sqlcmdを使うとSQLコマンドを直接たたくことできる。sqlcmdというコマンドもあるのだが、これはどうもデフォルトでは入らないらしく、その場合「Native Client」をインストールしろと言われる。

デフォルトではこれらのスナップインは使えないので、「Get-PsSnapin -Registered」で使えるかどうかの確認→「Pss-Pssnapin」という流れを踏む。詳細は[PowerShell]SQL PowerShellとスナップインを参照。こうすると Invoke-Sqlcmd が使えるようになる。

Invoke-Sqlcmdコマンドレットは、MySQLPostgreSQLコマンドラインツールとよく似ていて、ユーザー名、データベース名、(必要ならパスワード)、クエリを指定して投げてその結果を纏めて受け取ることができる。

  $sql = "select count(*) from TABLE_SAMPLE";
  $cnt = Invoke-Sqlcmd -Database hoge -U foo -P bar -Query $sql
  $count = $cnt.Item(0)

みたいなスクリプト*1を書くと、テーブルの行数をPowerShellから取得できる。

とはいえ、これだけだとうれしくない。実際にはテーブルからある程度のデータを拾いたいはず。そういうときにはこうする。

  $sql = [String]::Format("select top 2 column1,column2,column3 from TABLE_SAMPLE");
  $it = Invoke-Sqlcmd -Database hoge -U foo -P bar -Query $sql
  foreach($ii in $it){
    $format = [String]::Format("{1},{2},{3}", $ii, $ii.Item(0), $ii.Item(1), $ii.Item(2))
    $format
  }

とすればOK。

もうちょい頭のよい書き方もあるんだろうけど、開発中のちょっとした確認にはこれで十分だった。

*1:本来はパスワードをこんなところに書いてはいけない。書かずに済むよう環境をセットアップするなりなんなりするべき。パーミッションに気を使うのは当然として