TSQL在不运行存储过程的情况下跳过exec语句

时间:2012-11-28 15:09:25

标签: sql sql-server tsql stored-procedures

我有一个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是正确的。

2 个答案:

答案 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作为参数的前缀)