SQLでファイル(バイナリ・画像)のデータをテーブルにINSERT・UPDATEする [SQLServer]

バイナリーデータ

SQLServerのテーブルにファイルをバイナリデータとして登録しておくことで、レポートを出力する際のテンプレートや、写真などの画像をデータベースで管理することができます。

データベースのテーブルにファイルのバイナリデータを登録しておけば、顧客管理システムのカルテデータの顔写真や、店舗管理システムの地図情報などを表示する際に、いちいちファイルシステムに配置された実ファイルにアクセスする必要がなくなります。

データベースでファイルのデータを管理することで、プログラムをとてもシンプルにすることができます。
(プログラムのインフラストラクチャ層でデータベースからとファイルからの2つの方法でのデータ読み書きを、データベースからのみデータを読み書きする1つの方法にまとめることができます。)

通常、バイナリデータをテーブルに登録する場合は、C#などのプログラムで更新するためのデータ管理用のアプリケーション(機能)を作成します。
しかし、テストデータなど一時的にデータを登録したい場合や、まだデータの更新に使用する管理用のアプリケーションができていない場合などでは、テーブルにデータを登録する別の方法があると便利です。

SQLServerでは、ファイルのバイナリデータをSQLでテーブルにINSERTするための方法が用意されています。

今回は、SQLを使用してファイルのバイナリデータをデータベースへ登録する方法について紹介します。

SQLでバイナリデータを登録するOPENROWSET関数

SQLServerでは、OPENROWSET関数を使用することで、SQLでファイルのバイナリデータをデータベースのテーブルに登録することができます。

OPENROWSET関数を使用してファイルからバイナリデータを取得する

OPENROWSET関数は、SELECTステートメントのFROM句で使用します。

FROM句にOPENROWSETを記述します。
OPENROWSETにはプロバイダーの「BULK」を指定し、その後にデータを読み込むファイルのパス(C:\data_file.pngなど)を指定します。
ファイルパスの後には、カンマ「,」を記述し、「SINGLE_BLOB」を記述します。
以下に「C:\Data\ImageFile.png」ファイルからデータを取得する例を示します。

上記の例では、SELECT句に「BulkColumn」を指定しています。
この「BulkColumn」を指定することで、OPENROWSET関数で取得するデータを読み取ることができます。
(SELECT句に「*」を指定した場合でもSELECTステートメントで取得されるデータの列名は「BulkColumn」になります。
OPENROWSET関数では、第1引数のプロバイダーに「BULK」を使用することで、ファイルのデータを行セットとして読み取って返します。

OPENROWSET関数を使用したデータのINSERT

OPENROWSET関数で取得したデータをテーブルにINSERT(挿入)する例を示します。
ここでは、サンプルのテーブルとして以下のテーブルを使用します。

上記のBINARY_DATAテーブルにファイル「C:\Data\ImageFile.png」をINSERTするSQLは次のようになります。

上記の例では、イメージファイルをテーブルにINSERTしていますが、ファイルはExcelやWordなどの形式でもテーブルにINSERTすることができます。

OPENROWSET関数を使用したデータのUPDATE

OPENROWSET関数はSELECTステートメントのFROM句で使用できますので、UPDATEステートメントのFROM句でも使用できます。
以下にOPENROWSET関数で取得したデータでBINARY_DATAテーブルのFILE_DATA列のデータをUPDATE(更新)する例を示します。

ここでは、Excelシートのファイル「C:\Data\WorkBook.xlsx」を取得してUPDATEしています。

参考

OPENROWSET関数は、ファイルからデータを取得するための専用の関数ではなく、プロバイダーを指定してデータソースにアクセスする関数です。
OPENROWSET関数の詳細については、以下のMicrosoftのドキュメントを参考にしてください。
OPENROWSET (Transact-SQL)