将文件夹中的图像导入SQL Server表

时间:2016-07-22 18:23:53

标签: sql-server

我在谷歌上搜索这个但我还没有找到任何好的解释,所以这就是我的问题。

我需要将产品图片导入到SQL Server的文件夹中,我尝试使用xp_cmdshell但没有成功。

我的图片位于C:\users\user.name\Images,图片的名称为产品ID,就像[product_id].jpg一样,它们将被插入带有产品ID和图片的表格中二进制作为列。

我只需要列出文件夹上的图像,将图像转换为二进制文件并将其插入带有文件名的表格中(作为product_id

我的问题是:

  • 如何列出文件夹中的图像?
  • 如何访问名称中包含点的文件夹(例如user.name
  • 如何将图像转换为二进制文件以便将它们存储在数据库中(如果SQL Server不自动执行此操作)

提前致谢

1 个答案:

答案 0 :(得分:2)

我想我会尝试一种基于xp_cmdshell的方法,只是为了踢。我想出了一些似乎对我有用的东西,所以我很想知道你在尝试使用xp_cmdshell时遇到了什么问题。请参阅评论,了解此处发生的事情的解释。

-- I'm going to assume you already have a destination table like this one set up.
create table Images (fname nvarchar(max), data varbinary(max));
go

-- Set the directory whose images you want to load. The rest of this code assumes that @directory
-- has a terminating backslash.
declare @directory nvarchar(max) = N'D:\Images\';

-- Query the names of all .JPG files in the given directory. The dir command's /b switch omits all
-- data from the output save for the filenames. Note that directories can contain single-quotes, so
-- we need the REPLACE to avoid terminating the string literal too early.
declare @filenames table (fname varchar(max));
declare @shellCommand nvarchar(max) = N'exec xp_cmdshell ''dir ' + replace(@directory, '''', '''''') + '*.jpg /b''';
insert @filenames exec(@shellCommand);

-- Construct and execute a batch of SQL statements to load the filenames and the contents of the
-- corresponding files into the Images table. I found when I called dir /b via xp_cmdshell above, I
-- always got a null back in the final row, which is why I check for fname IS NOT NULL here.
declare @sql nvarchar(max) = '';
with EscapedNameCTE as (select fname = replace(@directory + fname, '''', '''''') from @filenames where fname is not null)
select
    @sql = @sql + N'insert Images (fname, data) values (''' + E.fname + ''', (select X.* from openrowset(bulk ''' + E.fname + N''', single_blob) X)); '
from
    EscapedNameCTE E;
exec(@sql);

我从一个空的Images表开始。以下是运行上述内容后的内容:

Images table contents

现在我并没有声称这是开展这项工作的最佳方式; @nscheaffer提供的链接可能更合适,我将自己阅读,因为我不熟悉SSIS。但也许这有助于说明您最初尝试的那种方法。