続編:SQL Server 2008 に定義されているDB内のすべてのビューと列情報をPowerShellで取得する方法

ネタ元:SQL Server 2008 に定義されているテーブルやビューの列情報をPowerShellで取得する方法

前エントリを応用し、DB内にあるすべてのビューの列情報をCSVに書き出すようにしてみました。

データ型によっては出さないほうが良い列情報もあるのですが、

そこはWhere-Objectコマンドレットで制御可能なので、今回はあまり気にしないで作ってみました。

また、前エントリにて、

「Format-Tableではなく、System.String.Format に相当するものを -f で指定できる」

というのを教えて頂きましたので、それらを踏まえて、下記のようにしてみました。

定義済みのView

# DB内にあるすべてのViewを取得
#$views = (Get-ChildItem SQLSERVER:\SQL\サーバー名\インスタンス名(通常はDefaultなはず)\Databases\対象DB名\Views)
$views = (Get-ChildItem SQLSERVER:\SQL\37-47\MSSQLSERVER_2008+sa\Databases\SampleDb\Views)
$outFileName = "c:\work\ViewDocument.csv"

# Viewごとのループ
foreach( $view in $views )
{
    "$view`r`n" | Out-File $outFileName -Append

    # View名を取得
    # ( SQL Server がPowerShell変数を識別するために、
    #   "SQL Server変数=PowerShell変数" という書式で定義する。ホスト変数の定義方法の1つです)
    $viewname = "VIEWNAME=" + $view.Name

    # Viewの詳細をCSVファイルに出力する
    Invoke-Sqlcmd -Database "SampleDB" -Query "sp_help N'[dbo].[`$(VIEWNAME)]'" -variable $viewname |
    Where-Object {$_.Column_name -ne $null} |
    % {"{0}`t{1}({2})`t({3},{4})" -f $_.Column_name, $_.Type, $_.Length, |
    [System.Convert]::ToString($_.Prec).Trim(), [System.Convert]::ToString($_.Scale).Trim() } |
    Out-File $outFileName -Append

    # 次のViewへ
    "`r`n" | Out-File $outFileName -Append
}

★実行結果

だいぶ、テーブル/ビュー定義書に必要な情報がPowerShellでそろえられるようになってきました。

今回はビューの例でやりましたが、テーブルでも同じようにできるので、参考にしてみてください。

膨大な数のテーブル/ビューの定義書を作る場合、こういうのがあると作業を効率化できますし、

また、ビューの場合、テーブルと違って、SQL Server のデザイン画面で、

各項目の型を閲覧することができませんので、今回のようなツールがあると、かなり助かると思います。

コメント

タイトルとURLをコピーしました