1

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

新数据库使用文件流来存储文件。

我之前使用 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、文件名和完整路径。但是如何将这三个项目与二进制数据一起插入到新数据库中呢?我希望有人能帮帮忙

4

1 回答 1

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,然后执行它。请注意文件路径之前的双 '' - 在那里,因此您的输出语句最终具有单引号。

语法未经测试,所以让我知道它是否有效......

PS。您需要在 #Files 中为 fileStream 添加一个新字段

于 2011-08-12T21:20:39.833 回答