31

データファイルとテーブル名が変数であるテーブルにデータファイルを BULK INSERT するために使用する次のようなコードがあります。

DECLARE @sql AS NVARCHAR(1000)
SET @sql = 'BULK INSERT ' + @tableName + ' FROM ''' + @filename + ''' WITH (CODEPAGE=''ACP'', FIELDTERMINATOR=''|'')'

EXEC (@sql)

は標準テーブルでは問題なく機能しますが、データを一時テーブル (たとえば、#MyTable) にロードするには、同じようなことを行う必要があります。しかし、これを試してみると、次のエラーが表示されます。

Invalid Object Name: #MyTable

BULK INSERT問題は、ステートメントがオンザフライで構築され、 を使用して実行されEXEC、呼び出し#MyTableのコンテキストではアクセスできないという事実によるものだと思います。EXEC

このBULK INSERTようにステートメントを作成する必要があるのは、ファイル名をステートメントに挿入する必要があるためです。これが唯一の方法のようです。そのため、可変ファイル名を使用する、一時テーブルを使用できますが、両方は使用できないようです

これを達成する別の方法はありOPENROWSET(BULK...)ますか?


更新: OK、私が聞いているのは、BULK INSERT と一時テーブルが機能しないということです。提案に感謝しますが、私のコードを動的 SQL 部分に移動することは、私の場合は実用的ではありません。

を試しOPENROWSET(BULK...)てみると、同じ問題が発生しているようです。つまり、変数ファイル名を処理できず、以前のように SQL ステートメントを動的に構築する必要があります (したがって、一時テーブルにアクセスできません)。

したがって、非一時テーブルを使用し、別の方法でプロセスの分離を実現するという1つのオプションしか残されていません(一度に1つのプロセスのみがテーブルを使用できるようにすることによって-私はいくつかの方法を考えることができますそれを行う)。

気に障る。私が最初に意図した方法でそれを行う方がはるかに便利だったでしょう. 些細なことの 1 つにすぎませんが、1 日の時間を無駄にしてしまいます...

4

4 に答える 4

15

あなたがやりたいことはすべて行うことが可能です。アーロンの答えは完全ではありませんでした。

内部クエリで一時テーブルを作成するまで、彼のアプローチは正しいです。次に、外部クエリのテーブルに結果を挿入する必要があります。

次のコードスニペットは、ファイルの最初の行を取得し、それをテーブル@Linesに挿入します。

declare @fieldsep char(1) = ',';
declare @recordsep char(1) = char(10);

declare @Lines table (
    line varchar(8000)
);

declare @sql varchar(8000) = ' 
    create table #tmp (
        line varchar(8000)
    );

    bulk insert #tmp
        from '''+@filename+'''
        with (FirstRow = 1, FieldTerminator = '''+@fieldsep+''', RowTerminator = '''+@recordsep+''');

    select * from #tmp';

insert into @Lines
    exec(@sql);

select * from @lines
于 2012-01-11T19:53:57.590 に答える
1

http://msdn.microsoft.com/en-us/library/ms191503.aspx

一括挿入する前に、一意の名前でテーブルを作成することをお勧めします。

于 2010-03-04T18:18:21.473 に答える