MSSMS-CSV文件包含数据,但使用存储过程返回NULL



我一直在竭尽全力让下面描述的代码发挥作用。我对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

同样,我假设你的文件名中有日期。

最新更新