1

あるデータベースから別のデータベースに大量のファイルをインポートしようとしています。元のデータベースはファイル名をデータベース テーブルに格納し、実際のファイルはディスク上のどこかに格納していました。

新しいデータベースは、filestream を使用してファイルを格納します。

以前にOPENROWSETを使用して新しいデータベースにファイルをインポートしましたが、その場合は手動でフルパスを指定しましたが、うまくいきました。

この場合、複数のファイルがあるため、ディスク上のディレクトリの場所と古いDBのファイル名を組み合わせてパスを動的に構築できると考えました。

ただし、結局のところ、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、ファイル名、フル パスを取得できます。しかし、これら 3 つの項目をバイナリ データと一緒に新しい DB に挿入するにはどうすればよいでしょうか? 誰かが助けてくれることを願っています

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 に答える