Импорт файлов в базу данных SQL Server 2008 - PullRequest
1 голос
/ 12 августа 2011

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

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

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

Поскольку в этом случае я полагал, что есть несколько файлов, я мог быдинамически строить путь, комбинируя расположение каталога на диске с именами файлов из старой БД.

Однако, как выясняется, OPENROWSET не позволяет объединять строки.Я обнаружил, что можно пойти по пути использования динамического SQL (/5025507/t-sql-problema-so-strokoi-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

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

1 Ответ

0 голосов
/ 13 августа 2011

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

Синтаксис не проверен, поэтому дайте мне знать, если он сработает ...

PS. вам нужно будет добавить новое поле для fileStream в # Files

...