将文件导入SQL Server 2008数据库

时间:2011-08-12 15:01:19

标签: sql tsql openrowset

我正在尝试将大量文件从一个数据库导入另一个数据库。原始数据库将文件名存储在数据库表中,将实际文件存储在磁盘上的某个位置。

新数据库使用filestream存储文件。

我之前使用OPENROWSET将文件导入到新数据库中,但在这些情况下,我手动提供了完整路径,但工作正常。

在这种情况下有多个文件,我想我可以动态构建路径,将磁盘上目录的位置与旧数据库中的文件名相结合。

然而,事实证明,OPENROWSET不允许连接字符串。我发现可行的方法是使用动态SQL(http://stackoverflow.com/questions/6621579/t-sql-issue-with-string-concat)。

但是,我不知道如何将旧数据库表中的信息与OPENROWSET结合起来,以便能够将文件插入到新数据库中。

我目前的想法是这样的:

create table #Files
(
    IssueId int not null,
    FileName nvarchar(12) not null,
    FullPath nvarchar(255) not null
)

insert into #Files
select IssueId, FileName, @FilePath + '\' + FileName
from OLDDBO.dbo.Files

通过这种方式,我有ID,文件名和完整路径。但是如何将这三个项目与二进制数据一起插入新数据库?我希望有人可以提供帮助

1 个答案:

答案 0 :(得分:0)

当他们说动态时,他们意味着你必须构造SQL,然后执行它。因此,使用您的示例,您需要执行以下操作:


declare @sql varchar(max)

set @sql = 'insert into #Files  
select IssueId, FileName, @FilePath + '\' + FileName, 
CAST(fileStreamField AS VARBINARY(MAX))       
FROM OPENROWSET(BULK '' + @FilePath + '\' + FileName + '',SINGLE_BLOB)
from OLDDBO.dbo.Files'

execute(@sql) 

所以你基本上做的是构造要插入的sql,然后执行它。注意文件路径前面的double' - 就是这样,所以你的输出语句最终会有单引号。

语法未经测试,请让我知道它是否有用......

PS。您需要在#Files

中为fileStream添加一个新字段