无法从 SQL 中的平面文件批量插入

Unable to bulk insert from flat file in SQL

如果我执行下面的脚本,可以将数据插入table。

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.

请帮忙。提前致谢。

为此您需要使用动态 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参考:

来自https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql

试试

DECLARE @bulk_cmd varchar(1000);  
SET @bulk_cmd = 'BULK INSERT AdventureWorks2012.Sales.SalesOrderDetail  
FROM ''<drive>:\<path>\<filename>''   
WITH (ROWTERMINATOR = '''+CHAR(10)+''')';  
EXEC(@bulk_cmd);