我一直在竭尽全力让下面描述的代码发挥作用。我对MSSMS和SQL非常不熟悉。也就是说,我喜欢SQL数据库的效率,并且非常希望让这些代码发挥作用。
我已经用这个代码测试了我的CSV文件:
BULK INSERT BCPData
FROM 'D:cheesebcp_test.csv'
WITH (FIRSTROW = 2,
FIELDTERMINATOR = ','
,ROWTERMINATOR = '0x0a'
);
GO
它们很容易导入,数据也会显示出来。
然而,如果我尝试使用下面显示的代码(我需要一个自动将多个CSV文件导入到我的表中的代码(,我只得到";NULL";列中的结果。
我的查询如下:
exec ImportFiles 'd:cheese' , 'd:cheeseArchive' , 'bcp*.csv' , 'MergeBCPData'
我在使用以下代码创建必要的存储过程后运行此查询:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ImportFiles]') and `OBJECTPROPERTY(id, N'IsProcedure') = 1)`
drop procedure [dbo].[ImportFiles]
GO
create procedure ImportFiles
@FilePath varchar(1000) = 'd:cheese' ,
@ArchivePath varchar(1000) = 'd:cheeseArchive' ,
@FileNameMask varchar(1000) = 'bcp*.csv' ,
@MergeProc varchar(128) = 'MergeBCPData'
AS
set nocount on
declare @ImportDate datetime
select @ImportDate = getdate()
declare @FileName varchar(1000) ,
@File varchar(1000)
declare @cmd varchar(2000)
create table ##Import (s varchar(8000))
create table #Dir (s varchar(8000))
/*****************************************************************/
-- Import file
/*****************************************************************/
select @cmd = 'dir /B ' + @FilePath + @FileNameMask
delete #Dir
insert #Dir exec master..xp_cmdshell @cmd
delete #Dir where s is null or s like '%not found%'
while exists (select * from #Dir)
begin
select @FileName = min(s) from #Dir
select @File = @FilePath + @FileName
select @cmd = 'bulk insert'
select @cmd = @cmd + ' ##Import'
select @cmd = @cmd + ' from'
select @cmd = @cmd + ' ''' + replace(@File,'"','') + ''''
select @cmd = @cmd + ' with (FIELDTERMINATOR = '','''
select @cmd = @cmd + ',ROWTERMINATOR = ''0x0a''
)'
truncate table ##Import
-- import the data
exec (@cmd)
-- remove filename just imported
delete #Dir where s = @FileName
exec @MergeProc
-- Archive the file
select @cmd = 'move ' + @FilePath + @FileName + ' ' + @ArchivePath + @FileName
exec master..xp_cmdshell @cmd
end
drop table ##Import
drop table #Dir
go
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[MergeBCPData]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[MergeBCPData]
GO
create procedure MergeBCPData
AS
set nocount on
-- insert data to production table
insert BCPData
(
City ,
Visit_Duration_Seconds ,
Timezone ,
Most_Likely_Company
)
select
SUBSTRING('City', 1, 5),
SUBSTRING('Visit_Duration_Seconds', 1, 12),
SUBSTRING('Timezone', 1, 3),
SUBSTRING('Most_Likely_Company',1, 30)
from ##Import
go
如有任何帮助,我们将不胜感激。我希望这只是一个错误,因为我缺乏经验的眼睛太新颖了,无法捕捉。谢谢!
您说过"我需要一个自动将多个CSV文件导入到我的表中的代码"。文件名中是否存在可以利用的模式?文件名中有日期吗?如果你可以利用一些重复模式,比如一系列日期,你可以一次遍历文件夹中的所有文件,并将所有文件附加到一个表中。查看下面的代码,如果你有问题,请发回来。
DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=50) – we are running 50 loops...change this as needed
BEGIN
PRINT @intFlag
declare @fullpath1 varchar(1000)
select @fullpath1 = '''\your_path_hereFTP' + convert(varchar, getdate()- @intFlag , 112) + '_Daily.csv'''
declare @cmd1 nvarchar(1000)
select @cmd1 = 'bulk insert [dbo].[Daily] from ' + @fullpath1 + ' with (FIELDTERMINATOR = ''t'', FIRSTROW = 5, ROWTERMINATOR=''0x0a'')'
exec (@cmd1)
SET @intFlag = @intFlag + 1
END
以下是一些常见的日期格式。
http://www.sql-server-helper.com/tips/date-formats.aspx
同样,我假设你的文件名中有日期。