首页 > 数据库 > mysql教程 > 如何修复 SQL Server 批量插入存储过程中的''@filepath' 附近的语法不正确”错误?

如何修复 SQL Server 批量插入存储过程中的''@filepath' 附近的语法不正确”错误?

Susan Sarandon
发布: 2024-12-29 04:10:13
原创
470 人浏览过

How to Fix

通过存储过程批量插入:解决错误

在尝试将工作批量插入查询封装到存储过程中时,用户遇到了在 BULK INSERT 语句中使用文件变量时出错。用户的存储过程代码如下:

create proc dbo.InsertZipCode
@filepath varchar(500)='e:-digit Commercial.csv'
as
begin
BULK INSERT ZIPCodes 
FROM  @filepath 
WITH 
( 
     FIRSTROW = 2 ,
    FIELDTERMINATOR = ',', 
    ROWTERMINATOR = '\n' 
)
end
登录后复制

但是这段代码导致了如下错误:

Msg 102, Level 15, State 1, Procedure
InsertZipCode, Line 6 Incorrect syntax
near '@filepath'.

Msg 319, Level 15, State 1, Procedure
InsertZipCode, Line 7 Incorrect syntax
near the keyword 'with'. If this
statement is a common table
expression, an xmlnamespaces clause or
a change tracking context clause, the
previous statement must be terminated
with a semicolon.
登录后复制

这个问题的症结在于BULK INSERT无法接受文件名作为变量。虽然这样的语句是有效的:

BULK INSERT ZIPCodes 
FROM  'e:-digit Commercial.csv' 
WITH 
登录后复制

在 BULK 中使用文件名变量(例如 DECLARE @filename VARCHAR(255) SET @filename = 'e:5-digit Commercial.csv') INSERT 语句不可避免地会失败。

要解决此问题,一种可行的方法是将 BULK INSERT 语句构造为一个字符串(具有固定文件名)并使用 sp_executesql 动态执行它:

DECLARE @filepath nvarchar(500)
SET @filepath = N'e:-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
登录后复制

通过遵守这些准则,可以避免 BULK INSERT 无法接受文件名变量的问题,从而成功创建执行批量插入的存储过程。

以上是如何修复 SQL Server 批量插入存储过程中的''@filepath' 附近的语法不正确”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板