バイナリカラムを持つテーブルにファイルからデータを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