我有一个SQL Server存储过程,通常运行正常。但是,对于一条记录,当我浏览存储过程时,它正在“跳过”一行而不运行它。
if not exists ( select * ... ) begin
exec @Result = InsertRecord_A @AccountNo, @ID, @EventID;
if @Result <> 0 return @Result;
-- Do something else
insert into ...
select ...
end
在这种情况下,该行exec @Result...
被跳过。通常它会启动过程InsertRecord_A
,但我不能让它在此记录上运行。
有什么想法吗?
更新:出现以下错误消息:
Msg 201, Level 16, State 4, Procedure InsertRecord_A, Line 0
Procedure or function 'InsertRecord_A' expects parameter '@EventID', which was not supplied.
错误信息的奇怪之处在于,当它走过它时,@ EventID显示它的值为460是正确的。
答案 0 :(得分:3)
尝试将参数显式设置为正确的值,而不是按顺序位置传递它们,并希望它们的顺序正确:
exec @Result = InsertRecord_A @AccountNo = @AccountNo, @ID = @ID, @EventID = @EventID;
这当然是假设您的InsertRecord_A
过程确实需要3个与变量名称相同的过程。
如果您对此不确定,可以运行exec sp_help InsertRecord_A
或查看sys.parameters
表格以查看它们的名称。
答案 1 :(得分:1)
我认为@SchmitzIT要求程序InsertRecord_A的实际SQL代码(CREATE PROCEDURE等),而不是错误代码。 只是一个猜测:当我不小心改变过程定义中的参数数量时,你得到的错误是我过去的错误。如果你的过程改变了这样:
CREATE PROCEDURE InsertREcord_A @ExtraParameter int, @AccountNo int,@ID int,@EventID int
然后它将在位置4中查找@EventID参数。事实上,你在位置3传递一个名为@EventID的有效参数将无济于事!在这种情况下,位置3的传入参数和位置4的预期参数都被称为@EventID这一事实只是令人困惑。
(这就是为什么我总是在过程定义中用p作为参数的前缀)