2011-08-12 2 views
1

J'essaie d'importer une grande quantité de fichiers d'une base de données dans une autre. La base de données d'origine stockait les noms de fichiers dans une table de base de données et les fichiers réels quelque part sur le disque.Importer des fichiers dans la base de données SQL Server 2008

La nouvelle base de données utilise FileStream pour stocker les fichiers.

J'ai déjà importé des fichiers dans la nouvelle base de données en utilisant OPENROWSET, mais dans ces cas, j'ai fourni manuellement le chemin complet qui a bien fonctionné. Comme dans ce cas, il y a plusieurs fichiers que j'ai pensé que je pourrais construire dynamiquement le chemin combinant l'emplacement du répertoire sur le disque avec les noms de fichiers de l'ancien DB.

Cependant, il s'avère que OPENROWSET n'autorise pas la concaténation de chaînes. J'ai trouvé que le chemin à parcourir serait d'utiliser SQL dynamique (http://stackoverflow.com/questions/6621579/t-sql-issue-with-string-concat).

Cependant, je ne sais pas comment combiner les informations de l'ancienne table de base de données avec OPENROWSET pour pouvoir insérer les fichiers dans la nouvelle base de données.

Mon idée actuelle est quelque chose comme ceci:

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 

De cette façon, je l'ID, nom de fichier et le chemin complet. Mais comment puis-je insérer ces trois éléments avec les données binaires dans la nouvelle base de données? J'espère que quelqu'un peut aider

Répondre

0

Quand ils disent dynamique, ils signifient que vous devez construire le SQL, puis l'exécuter. Ainsi, en utilisant votre exemple, vous aurez besoin de faire quelque chose comme ceci:

 

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) 
 

Alors ce que vous faites essentiellement construit sql à insérer, puis l'exécuter. Notez le double '' avant le chemin du fichier - c'est là que votre déclaration de sortie a finalement le guillemet simple.

La syntaxe est non vérifiée, alors laissez-moi savoir si ça marche ...

PS. Vous aurez besoin d'ajouter un nouveau champ pour le fichier FileStream dans #Files

+0

Il y avait encore quelques citations manquantes mais c'était bien la solution. Merci! – Pieter

Questions connexes