使用存储过程批量插入

Dr.*_*len 30 sql stored-procedures bulkinsert sql-server-2008

我有一个工作正常的查询:

BULK INSERT ZIPCodes 
FROM  'e:\5-digit Commercial.csv' 
WITH 
( 
     FIRSTROW = 2 ,
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
)
Run Code Online (Sandbox Code Playgroud)

但现在我想为它创建一个存储过程.

我写了下面的代码来制作它的存储过程:

create proc dbo.InsertZipCode
@filepath varchar(500)='e:\5-digit Commercial.csv'
as
begin
BULK INSERT ZIPCodes 
FROM  @filepath 
WITH 
( 
     FIRSTROW = 2 ,
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
)
end
Run Code Online (Sandbox Code Playgroud)

但它显示错误:

消息102,级别15,状态1,过程InsertZipCode,行6'@ filepath'附近的语法不正确.

消息319,级别15,状态1,过程InsertZipCode,第7行关键字'with'附近的语法不正确.如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号终止先前的语句.

请告诉我我做错了什么以及如何使其在存储过程中工作.

谢谢

mar*_*c_s 41

存储过程代码没有任何问题 - 重点是:BULK INSERT命令不能接受文件名作为变量.

这确实有效:

BULK INSERT ZIPCodes 
FROM  'e:\5-digit Commercial.csv' 
WITH 
Run Code Online (Sandbox Code Playgroud)

但这从不起作用 - 在存储过程中或不存在:

DECLARE @filename VARCHAR(255)
SET @filename = 'e:\5-digit Commercial.csv' 

BULK INSERT ZIPCodes 
FROM @filename
WITH 
Run Code Online (Sandbox Code Playgroud)

不幸的是,你不能这样做.您可以考虑将您的BULK INSERT语句构建为一个字符串(具有固定的文件名),然后将其作为动态SQL执行 - 但我真的没有看到任何其他解决方案.

DECLARE @filepath nvarchar(500)
SET @filepath = N'e:\5-digit Commercial.csv'

DECLARE @bulkinsert NVARCHAR(2000)

SET @bulkinsert = 
       N'BULK INSERT ZIPCodes FROM ''' + 
       @filepath + 
       N''' WITH (FIRSTROW = 2, FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'')'

EXEC sp_executesql @bulkinsert
Run Code Online (Sandbox Code Playgroud)