0

SQL Server 2008 の場合:

フォルダー内のファイルをループしているときに、テーブルに一括挿入されなかった各ファイルが失敗した理由を特定しようとしています。

コードの問題は、exec(@sql) の実行後に最初にメッセージを提供した後に停止し、次のファイルの一括挿入に進まないことです。

stackoverflow からの共通コードを使用します。

 --BULK INSERT MULTIPLE FILES From a Folder 
 drop table ALLFILENAMES
 drop table #target_teststaging_table_in_database
--a table to loop thru filenames drop table ALLFILENAMES
  CREATE TABLE ALLFILENAMES(WHICHPATH VARCHAR(255),WHICHFILE varchar(255))

--some variables
declare @filename varchar(255),
        @path     varchar(255),
        @sql      varchar(8000),
        @cmd      varchar(1000)


--get the list of files to process:
set @path = 'e:\errorlog\' 
SET @cmd = 'dir ' + @path + '*.csv /b'
INSERT INTO  ALLFILENAMES(WHICHFILE)
EXEC Master..xp_cmdShell @cmd
UPDATE ALLFILENAMES SET WHICHPATH = @path where WHICHPATH is null

select top 0 * into #target_teststaging_table_in_database  from  dbo.temp_bccsvtable where 1 = 0
--cursor loop
declare c1 cursor for SELECT WHICHPATH,WHICHFILE FROM ALLFILENAMES where WHICHFILE like '%.csv%'
open c1
fetch next from c1 into @path,@filename
While @@fetch_status <> -1
  begin --try
  --bulk insert won't take a variable name, so make a sql and execute it instead:
    --print @filename
    set @sql = 'bulk insert #target_teststaging_table_in_database from ''' + @path + @filename + ''' '
                           + '     with ( 
                                   datafiletype = ''char'', 
                                   fieldterminator = '','', 
                                   firstrow = 2,
                                   rowterminator = ''\n'', 
                                   maxerrors =0
                                 ) '
--print @sql
   exec (@sql)

 fetch next from c1 into @path,@filename
 end

 close c1
 deallocate c1


--Extras
drop table #target_teststaging_table_in_database
delete from ALLFILENAMES where WHICHFILE is NULL
  -- select * from ALLFILENAMES
drop table ALLFILENAMES

約1000個のファイルがあり、それらがロードされなかった理由を特定する必要があるため、続行する方法についての意見をいただければ幸いです。以前は try catch ブロックで使用していました

--print ERROR_NUMBER()
--print ERROR_SEVERITY()
--print ERROR_STATE()
--print ERROR_LINE()
--print ERROR_MESSAGE()

しかし、try catch ブロックに入れなくても得られるメッセージは次のとおりです。具体的には BOLD のメッセージを探しているので、テーブルのデータ型/サイズを修正できます。

Msg 4867, Level 16, State 1, Line 1

行 23、列 247 (diagsversion) の一括読み込みデータ変換エラー (オーバーフロー)。

メッセージ 7399、レベル 16、状態 1、行 1

リンク サーバー "(null)" の OLE DB プロバイダー "BULK" がエラーを報告しました。プロバイダーは、エラーに関する情報を提供しませんでした。

メッセージ 7330、レベル 16、状態 2、行 1

Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".

ありがとう。

4

0 に答える 0