現在、列 ( id#(int), picture(varbinary(MAX) ) を含むテーブルがあり、HDD に大量の写真を含むフォルダーがあります。フォルダー内の写真は「id」によって名前が付けられますテーブルでそれらを一致させたいのですが、どうすればよいですか?
Example:
Table Row: id=25166, picture=NULL
25166.jpg
現在、列 ( id#(int), picture(varbinary(MAX) ) を含むテーブルがあり、HDD に大量の写真を含むフォルダーがあります。フォルダー内の写真は「id」によって名前が付けられますテーブルでそれらを一致させたいのですが、どうすればよいですか?
Example:
Table Row: id=25166, picture=NULL
25166.jpg
SQL チェックアウトのみを使用する例が必要な場合は、次のようにします。
カーソルを使用して、画像データを含まない各行をループ処理し、見つかった行ごとにOPENROWSET BULK プロバイダーを使用してファイルを読み込みます。
CREATE TABLE ImageStore
(
id INT,
picture VARBINARY(MAX) NULL
)
GO
INSERT INTO ImageStore (id) VALUES(25166)
INSERT INTO ImageStore (id) VALUES(25167)
DECLARE @id INT
DECLARE image_cursor CURSOR FOR
SELECT id FROM ImageStore WHERE picture IS NULL
OPEN image_cursor;
FETCH NEXT FROM image_cursor
INTO @id;
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @sql NVARCHAR(MAX)
DECLARE @imagePath NVARCHAR(255)
SET @imagePath = 'C:\' + RTRIM(LTRIM(STR(@id))) + '.gif'
SET @sql = 'UPDATE ImageStore '
SET @sql = @sql + 'SET picture = (SELECT BulkColumn FROM OPENROWSET( BULK ''' + @imagePath + ''', Single_Blob) AS picture) '
SET @sql = @sql + 'WHERE id = ' + STR(@id)
BEGIN TRY
EXECUTE sp_executesql @sql
END TRY
BEGIN CATCH
END CATCH
FETCH NEXT FROM image_cursor
INTO @id;
END
CLOSE image_cursor;
DEALLOCATE image_cursor;
SELECT * FROM ImageStore
DROP TABLE ImageStore