2017-04-05 70 views
0

如果我执行下面的脚本,可以将数据插入到表中。无法从SQL中的平面文件批量插入

CREATE PROCEDURE dbo.loadDataFrFlatFile 

AS 
BEGIN 


BULK INSERT PERSONS 
FROM 'C:\SampleData1.csv' 
WITH (FieldTerminator = '|', RowTerminator = '\n') 
END 

RETURN 1 

GO 

EXEC dbo.loadDataFrFlatFile 

但是,如果我把文件路径作为输入变量,它不起作用。

CREATE PROCEDURE dbo.loadDataFrFlatFile 
(
    @flatFilePath varchar(255) 
) 

AS 
BEGIN  

BULK INSERT PERSONS 
FROM ' + @flatFilePath + ' 
WITH (FieldTerminator = '|', RowTerminator = '\n') 
END 

RETURN 1 

GO 

EXEC dbo.loadDataFrFlatFile @flatFilePath = 'C:\SampleData1.csv' 

显示的错误是:

Msg 4860, Level 16, State 1, Procedure loadDataFrFlatFile, Line 12 
Cannot bulk load. The file " + @flatFilePath + " does not exist. 

请帮助。提前致谢。

回答

1

您将需要使用动态SQL为,例如:

create procedure dbo.loadDataFrFlatFile (@flatFilePath varchar(255)) as 
begin; 
declare @sql nvarchar(max) = 'bulk insert persons 
from ''' + @flatFilePath + ''' 
with (FieldTerminator = ''|'', RowTerminator = ''\n'') 
'; 
exec sp_executesql @sql; 
return 1 
end; 
go 

exec dbo.loadDataFrFlatFile @flatFilePath = 'C:\SampleData1.csv' 

小心这对于SQL注入,确保只有那些谁需要使用它必须执行它的权限。

您还可以在连接并执行该变量之前对变量可以包含的值进行白名单和黑名单列表。

动态SQL参考: