SQL Server の varbinary 型データを PowerShell で取得して保存する

今回は PowerShell を使って SQL Server に保存された varbinary 型のデータを取得してファイル保存する方法を紹介します。

私の担当システムでは画像を扱っており、SQL Server のデータベースに varbinary 型で保存するようにしてます。

これを時々何が入っているのか確認したくなるのですが、一々C#でアプリ作って確認するのは手間ですよね?

PowerShellでサクッと出来ないかなと調べたら意外と単純だったのでここに記載します。

やりかた

以下のコマンドで行けます。

$Image = Invoke-Sqlcmd `
-ServerInstance "localhost" `
-Database "DATABASE" `
-Username "sa" `
-Password "P@ssword!" `
-MaxBinaryLength 5000000 `
-Query "select [Value] from [Image] where [ImageId] = 10000"
Set-Content -Path .\Image.tif -Value $Image.Value -AsByteStream

-MaxBinaryLength の値を調整するのが肝です。

サイズは Transact-SQLlen() 関数とか使えばわかるのでそれよりちょっと大きい値を指定しておけばいいと思います。

ちなみに、Windows PowerShellの場合は -AsByteStream ではなく -Encoding Byte と指定します。

2021/9/11 追記

一々変数に格納しなくてもいい方法が分かったので追記しておきます。

以下の様に一度括弧で括って評価してからパイプラインで繋げば行けます。

(Invoke-Sqlcmd `
-ServerInstance "localhost" `
-Database "DATABASE" `
-Username "sa" `
-Password "P@ssword!" `
-MaxBinaryLength 5000000 `
-Query "select [Value] from [Image] where [ImageId] = 10000").Value |
Set-Content -Path .\Image.tif -AsByteStream