通过存储过程批量插入:解决错误
在尝试将工作批量插入查询封装到存储过程中时,用户遇到了在 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中文网其他相关文章!