使用存储过程批量插入
我有一个运行良好的查询:
BULK INSERT ZIPCodes
FROM 'e:\5-digit Commercial.csv'
WITH
(
FIRSTROW = 2 ,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
但现在我想为其创建一个存储过程。
我写了下面的代码来制作它的存储过程:
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
但它显示错误:
消息 102,级别 15,状态 1,过程 InsertZipCode,第 6 行 语法错误 靠近“@filepath”。
消息 319,级别 15,状态 1,过程 InsertZipCode,第 7 行 语法错误 靠近关键字“with”。如果这个 语句是一个公用表 表达式、xmlnamespaces 子句或 更改跟踪上下文子句, 之前的语句必须终止 带分号。
请告诉我我做错了什么以及我可以做些什么来使它在存储过程中工作。
谢谢
I have a query which is working fine:
BULK INSERT ZIPCodes
FROM 'e:\5-digit Commercial.csv'
WITH
(
FIRSTROW = 2 ,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
but now I want to create a stored procedure for it.
I have written below code to make its stored procedure:
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
but its showing error:
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.
Please tell me what I am doing wrong and what I can do to make it work in stored procedure.
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

发布评论
评论(4)
如果您有权访问 SQLCmd exe,则还有动态 SQL 的替代方案。
SqlCmd 实用程序允许您使用 -v 参数传递字符串替换变量。
您可以使用名为“filepath”的模板变量,当您通过命令行执行脚本时,该变量将被替换。
SQL 脚本如下所示:
BULK INSERT ZIPCodes
FROM '$(filepath)'
WITH
(
FIRSTROW = 2 ,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
end
然后,您可以使用如下所示的命令从命令行执行脚本:
sqlcmd -b -S SERVER\INSTANCEHERE -E -i "PATH\FILENAMEHERE.Sql" -v FilePath = "e:\5-digit Commercial.csv" -s "|"
该示例的重要部分是 -v 参数:
-v FilePath = "e:\5-digit Commercial.csv"
create PROC TestInsert
(
@stuName NVARCHAR(50) ,
@XmlData XML
)
AS
BEGIN
BEGIN TRY
INSERT INTO dbo.Test_Student
( stuName
)
VALUES ( @stuName
);
DECLARE @id BIGINT;
SET @id = ( SELECT SCOPE_IDENTITY()
);
INSERT INTO dbo.Test_Qual
( stuid ,
stuclass ,
InstituteId ,
obtmark ,
totalmark ,
per
)
SELECT @id ,
col.value('stuclass[1]', 'nvarchar(50)') AS stuclass ,
col.value('InstituteId[1]', 'int') AS InstituteId ,
col.value('obtmark[1]', 'nvarchar(100)') AS obtmark ,
col.value('totalmark[1]', 'nvarchar(50)') AS totalmark ,
col.value('per[1]', 'nvarchar(50)') AS per
FROM @XmlData.nodes('Parent/child') AS Doc ( col );
SELECT @id AS RegisIdNUH ,
1 AS Flag ,
'Save' AS Msg
FROM dbo.Test_Student R
WHERE R.stuid = @id;
END TRY
BEGIN CATCH
SELECT 0 AS Flag ,
'Some Error occur' AS Msg;
ROLLBACK;
END CATCH;
END;
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
您的存储过程代码没有任何问题 - 要点是:BULK INSERT 命令无法接受文件名作为变量。
这确实有效:
但这永远不会起作用 - 无论是否在存储过程中:
所以不幸的是,你不能这样做。您可以考虑将 BULK INSERT 语句构建为字符串(具有固定文件名),然后将其作为动态 SQL 执行 - 但我确实没有看到任何其他解决方案。
There's nothing wrong with your stored procedure code - the point is: the
BULK INSERT
command cannot accept a file name as a variable.This does work:
but this never works - within a stored proc or not:
So you just cannot do it this way, unfortunately. You could consider building up your
BULK INSERT
statement as a string (with a fixed file name) and then execute it as dynamic SQL - but I don't really see any other solution.