Импорт файлов в базу данных SQL Server 2008

Я пытаюсь импортировать большое количество файлов из одной базы данных в другую. Исходная база данных хранила имена файлов в таблице базы данных, а сами файлы где-то на диске.

Новая база данных использует файловый поток для хранения файлов.

Раньше я импортировал файлы в новую базу данных с помощью 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

Таким образом, у меня есть идентификатор, имя файла и полный путь. Но как мне вставить эти три элемента вместе с бинарными данными в новую БД? Я надеюсь, что кто-то может помочь


person Pieter    schedule 12.08.2011    source источник


Ответы (1)


Когда они говорят динамический, они имеют в виду, что вы должны построить 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

person M.R.    schedule 12.08.2011
comment
Еще не хватало пары цитат, но это действительно было решением. Спасибо! - person Pieter; 18.08.2011