レベルエンター山本大のブログ

面白いプログラミング教育を若い人たちに

BLOCKVROCKリファレンス目次はこちら

SQLクエリだけでバイナリ列にファイルからデータを登録する裏技

バイナリカラムを持つテーブルにファイルからデータをInsertしたい場合、

いちいちプログラムを作る必要があって面倒です。


何かいい方法はないかと調べていて、

SQLクエリだけでバイナリ列にファイルからデータを登録する裏技

を見つけました。

SQLServerの特殊な関数OPENROWSETを利用します。

(OPENROWSETは、SqlServer 7.0ぐらいからあるので使えるかも※2005のみ検証)

クエリは以下です。

INSERT INTO img([id],[image]) 
SELECT 
	0 as [id],
	BulkColumn as [image] --読み込んだバイナリデータ
FROM 
	OPENROWSET(BULK N'c:\images\test.gif', SINGLE_BLOB) as tempImg


BulkColumnというカラム名で、バイナリデータが読み取れるので、これをInsert文に利用します。


※ちなみに、テストのためのテーブルのCreate文

CREATE TABLE [dbo].[img](
	[id] [int] NULL,
	[image] [varbinary](max) NULL
)

本来、OPENROWSET関数はクエリのFrom句の中で

「OLE DBデータソースの結果」をテーブルかのように参照する関数ですが、

裏技的に上記のような使い方もあるんですね!


■OPENROWSETの詳しい説明は以下。
http://msdn.microsoft.com/ja-jp/library/aa276850(SQL.80).aspx

補足OPENQUERY

似た関数で、OpenQueryというのもあります。

■OPENQUERY
http://msdn.microsoft.com/ja-jp/library/aa276848(SQL.80).aspx

こちらはリンク サーバーに対するクエリをOracle データベースに対する
パススルークエリをテーブルのように使用することができます。

EXEC sp_addlinkedserver 'OracleSvr',
   'Oracle 7.3',
   'MSDAORA',
   'ORCLDB'
GO
SELECT *
FROM OPENQUERY(OracleSvr, 'SELECT name, id FROM joe.titles')
GO