对于 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 块中没有得到它的消息如下,我专门查看粗体中的消息,因此我可以更正表中的数据类型/大小。
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)".
谢谢。