SQLで検索したimageデータをファイルに直接出力するにはbcpユーティリティを利用します。
といっても、そう簡単にできるものではありません^^;
bcpユーティリティでファイルを出力する場合にはまず以下のようなフォーマットファイルを用意しなければなりません。
8.0 1 1 SQLIMAGE 0 205 "" 1 FILE_IMAGE ""
このフォーマットファイルではFILE_IMAGEという列をSQLIMAGE型として出力するよう指示しているのですが、問題は3行目の4つめの項目、データサイズです。
データサイズは当然のことながらデータによって異なります。
そのため、出力する各imageデータごとにフォーマットファイルを用意してやらなければなりません。
となると、あらかじめ用意しておくのではなく、動的に作ってやらなければなりません。
imageデータを出力する手順は、まず出力するimageデータのデータサイズを取得し、それを元にフォーマットファイルを出力し、その後、imageデータをファイルに出力するためのbcpコマンドを編集して実行するということになります。
具体的な出力例を以下に示します。
DECLARE
@sqltext varchar(1000),
@cmdtext varchar(1000),
@file_id int,
@file_name varchar(100),
@length int
BEGIN
--imageデータを取得するカーソルを定義し、1件ずつ取得する。
SET @sqltext = 'SELECT FILE_ID, FILE_NAME, DATALENGTH( FILE_IMAGE ) FROM TABLE1'
EXEC ('DECLARE cur CURSOR FOR ' + @sqltext + ' FOR READ ONLY')
OPEN cur
FETCH NEXT FROM cur INTO @file_id, @file_name, @length
WHILE @@FETCH_STATUS = 0
BEGIN
--フォーマットファイルを作成する。
SET @cmdtext = 'ECHO 8.0 > FILE.FMT'
EXEC master.dbo.xp_cmdshell @cmdtext
SET @cmdtext = 'ECHO 1 >> FILE.FMT'
EXEC master.dbo.xp_cmdshell @cmdtext
SET @cmdtext = 'ECHO 1 SQLIMAGE 0 '
+ CAST(@length AS VARCHAR)
+ ' "" 1 FILE_IMAGE "" >> FILE.FMT'
EXEC master.dbo.xp_cmdshell @cmdtext
--ファイルを出力する。
SET @cmdtext = 'BCP "SELECT FILE_IMAGE FROM '+ DB_NAME() + '.dbo.TABLE1 WHERE FILE_ID = '
+ CAST(@file_id AS VARCHAR) + '" queryout "'
+ @file_name + '" -f "FILE.FMT"'
EXEC master.dbo.xp_cmdshell @cmdtext
FETCH NEXT FROM cur INTO @file_id, @file_name, @length
END
CLOSE cur
DEALLOCATE cur
END
GO
とまぁ、こんな具合で少々ブサイクなやり方になってしまうのですが、これでimageデータを無理矢理ファイルに出力することができます。この方法はテキストデータをファイルに出力する時にも応用は可能なので、ニーズに応じていろいろと工夫してみるといいでしょう。
【関連エントリ】
[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