[SQL Server] imageデータをファイルから直接登録する方法 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

SQL Serverにはimageデータをファイルから直接登録する方法がいくつかあります。


もっとも、imageデータを直接登録するための専用の方法ではなく、ファイルからデータを直接登録する方法の応用なのですが...

1.bcpユーティリティによるファイルのアップロードの応用

"[SQL Server] テキストファイルの入出力方法"で触れたように、bcpユーティリティを使えば、テキストファイルからテーブルにデータをアップロードすることができます。


しかし、アップロードできるデータはテキストデータだけではありません。


フォーマットファイルを工夫することによって、imageデータをアップロードすることもできます。

imageデータをアップロードするときのフォーマットファイルは以下のようになります。

test.fmt

  8.0
  2
  1 SQLIMAGE 0 155845 "" 2 IMAGE_DATA ""

3行目の2つ目の項目にSQLIMAGEというデータ型を指定し、4つ目の項目にimageデータのファイルサイズを指定すれば、imageデータのファイルが丸ごと指定した列にアップロードするという指示になります。

このフォーマットファイルとimageデータのファイルを用意し、以下のようにbcpコマンドを実行すれば、

bcp db1.dbo.TABLE1 in test.jpg -Usa -Psa -SSERVER1 -ftest.fmt

test.jpgがTABLE1のIMAGE_DATA列にアップロードされるというわけです。

ただ、1ファイル=1レコードの1カラムとなってしまうので、imageデータと他の列のデータを同時にアップロードすることはできません。


そのため、imageデータ以外でDEFAULT値なしのNOT NULL列が存在していると制約違反となってしまったり、アップロードしたimageデータを一意に識別する情報が同時にアップロードできないという問題があります。

後者については以下のように一意に識別する情報はIDENTITY属性を持った列を1列持たせると方法で回避できるのですが...

create table TABLE1 (
  ID int identity (1, 1) not null,
  IMAGE_DATA image
)
あと複数レコードのimageデータを同時にアップロードすることもできないのが難点です。
2.BII.EXEによるファイルのアップロード

BII.EXEはリソースキットに付属しているユーティリティで、bcpユーティリティと同じくファイルからデータをアップロードすることができます。

BII.EXEの場合、bcpユーティリティのようにフォーマットファイルを用意する必要はありません。


区切り文字で区切られたデータファイルを用意すればそれでデータのアップロードができます。


imageデータは@ファイル名で表すことにより、外部ファイルを利用できるようになっています。

test.dat

1,あああ,aaa,@a.jpg
2,いいい,bbb,@b.jpg
3,ううう,ccc,@c.jpg
上記のようなデータファイルと@ファイル名で示したimageデータのファイルを用意し、以下のようにBII.EXEを実行すれば、

bii TABLE1 in test.dat -SSERVER1 -Ddb1 -Usa -Psa -TTABLE1 -t, -v

imageデータを含むレコードがアップロードされるというわけです。

bcpユーティリティと違ってimageデータを外部ファイルとして指定できるので、1つのデータファイルで複数のレコードを同時にアップロードできるのが利点ですが、テーブルの全ての列にデータをセットしなければならないのが難点です。

また、SQL Serverの標準の機能ではないため、本格的にアプリケーションに組み入れるような使い方をしていいものかどうかも微妙なところです。


という具合に、上記の2つの方法でimageデータをファイルから直接登録することは可能ですが、いずれも使用方法に制約が多いのが難点です。


それにいずれの方法もデータベース外部のユーティリティを使った方法であるため、トランザクションの内部で実行することができません。


ゆえにimgaeデータのアップロードと他のオペレーションを同一トランザクションとして処理したい場合は、別の方法をとらなくてはなりません。




【関連エントリ】
[SQL Server] JDBCによるtext、ntext、imageの操作方法(その1) 2005/03/02
[SQL Server] JDBCによるtext、ntext、imageの操作方法(その2) 2005/03/03
[SQL Server] text型やimage型を読み込む際の最適なバッファサイズは? 2005/03/09
[SQL Server] imageデータをファイルから直接登録する方法 2005/03/15
[SQL Server] BULK INSERTステートメントによるデータのアップロード 2005/03/16
[SQL Server] imageデータをファイルに直接出力する。2005/03/17
[SQL Server] image型やtext型はテキストポインタを利用して取得したほうが速い 2005/08/04