今回は PowerShell を使って SQL Server に保存された varbinary
型のデータを取得してファイル保存する方法を紹介します。
私の担当システムでは画像を扱っており、SQL Server のデータベースに varbinary
型で保存するようにしてます。
これを時々何が入っているのか確認したくなるのですが、一々C#でアプリ作って確認するのは手間ですよね?
PowerShellでサクッと出来ないかなと調べたら意外と単純だったのでここに記載します。
やりかた
以下のコマンドで行けます。
Invoke-Sqlcmd ` -ServerInstance "localhost" ` -Database "DATABASE" ` -Username "sa" ` -Password "P@ssword!" ` -MaxBinaryLength 5000000 ` -Query "select [Value] from [Image] where [ImageId] = 10000" | Select-Object -ExpandProperty Value | Set-Content -Path .\Image.tif -AsByteStream
-MaxBinaryLength
の値を調整するのが肝です。
サイズは Transact-SQL の len()
関数とか使えばわかるのでそれよりちょっと大きい値を指定しておけばいいと思います。
ちなみに、Windows PowerShellの場合は -AsByteStream
ではなく -Encoding Byte
と指定します。
Invoke-Sqlcmd について
上記のコマンドを実行するには SqlServer Module という PowerShell モジュールがインストールされている必要があります。
以下のコマンドでインストールします。
Install-Module -Name SqlServer
なお、SqlServer Module は SQL Server Management Studio 16.x のバージョンには同梱していますが*1、それ以外のバージョンの場合は PowerShell Galleryからオンライン、もしくはマニュアルでのインストールが必要になります。