PowerShellを使用したさまざまな処理

他にも、PowerShellで可能な処理をいくつか見ていこう。まずはSMOを使用した少し複雑な例として、インデックスを作成してみよう。まず、SQL Server Management Studioで「インデックス」を右クリックし、「PowerShellの起動」をクリックする。

「インデックス」の右クリックから「PowerShellの起動」

SMOを使用してインデックスを作成する場合、まずIndexクラスのインスタンスを生成した後、IndexedColumnクラスのインスタンスを生成し、両者を関連づける必要がある。たとえばEmployeeテーブルのAgeカラムにインデックスを作成する場合は、次のようなPowerShellのスクリプトを実行する。

$index = New-Object Microsoft.SqlServer.Management.Smo.Index
$index.Parent = Get-Item ..
$index.Name = "Index_Test"

$icol = New-Object Microsoft.SqlServer.Management.Smo.IndexedColumn
$icol.Name = "Age"
$index.IndexedColumns.Add($icol)

$index.Create()

上記のコマンドを実行後、SQL Server Management Studioからインデックスが作成されていることが確認できる。

上記のサンプルスクリプト実行後のSQL Server Management Studioの画面。インデックスが生成されていることがわかる

また、PowerShellからSQL Serverを操作する場合、SQL文を直接実行することも可能だ。直接SQL文を実行するときは、Invoke-Sqlcmdコマンドレットを使用する。

たとえばEmployeeテーブルにInsert文を実行する場合は、Employeeテーブルに相当するフォルダに移動した後、以下のようなコマンドを実行すればよい。

Invoke-Sqlcmd "INSERT INTO Employee VALUES(5,'田中',30);"

オプションなしでInvoke-Sqlcmdコマンドレットを実行すると、現在のフォルダに相当するデータベースに対してSQL文が実行されることになる。また、レコードの検索を行う場合は次のようなコマンドを実行する。

Invoke-Sqlcmd "SELECT * FROM Employee;"

上記のコマンドを実行すると、検索結果が表として取得できることを確認できる。この結果もPowerShellのオブジェクトなので、結果に対してPowerShellのパイプ機能を適用して絞り込みを行うことも可能だ。

たとえば、Employeeテーブルを検索した結果から、Ageカラムの値が20より大きいレコードを絞り込むためには、次のようなコマンドを実行すればよい。

Invoke-Sqlcmd "Select * FROM Employee;" | Where {$_.Age -gt 20}

ただ、PowerShellを使用してIISやActive Directoryの管理を行う場合などにおいては、こうしたパイプ機能が非常に役立つのだが、SQL Serverの場合はSQL文自体を使えば絞り込みや並び替えができるので、他プロダクトほどの有り難みはないかもしれない。

とはいえ、上記はあくまで概要を説明するための例であり、工夫次第で効率化を図れる場面は多々ある。ちょっとした簡略化の積み重ねが大きな効率化を生み出すので、いろいろと試して使ってほしい。