2

我不确定如何做到这一点。我们正在调试一个问题,如果插入成功,我们需要知道@@Error 是否可能为非零。如果@Error <> 0,我们有一个退出的存储过程。如果我们知道这个问题的答案,那会有所帮助。有人知道吗?

代码如下。我们想知道如果插入成功,是否有可能进入 goto 语句。

    -- This happened
    insert into Workflow
    (SubID, ProcessID, LineID, ReadTime)
    values
    (@sub_id, @proc_id, @line_id, @read_time)

    set @error = @@Error
    set @insertedWorkflowId = SCOPE_IDENTITY()
    if @error <> 0 
    begin
        set @error_desc = 'insert into tw_workflow'
        goto ERROR_EXIT
    end

    -- This didn't happen
    INSERT INTO Master.WorkflowEventProcessing (WorkflowId, SubId, ReadTime, ProcessId, LineId) VALUES (@insertedWorkflowId, @sub_id, @read_time, @proc_id, @line_id)
    INSERT INTO Master.ProcessLogging (ProcessCode, WorkflowId, SubId, EventTime) VALUES (10, @insertedWorkflowId, @sub_id, GETDATE())

编辑

也许更好的方式来说明问题是这样的:第一个插入发生了,但最后两个没有。这怎么可能?也许最后两个插入只是失败了?

4

2 回答 2

2

如果此插入成功,那么将有一个非零@@rowcount,因为您只是在使用values(而不是select...where可以“成功”插入 0 行)。您可以使用它在其中编写一些调试检查,或者将其作为例程的一部分永久包含在内。

insert into Workflow
(SubID, ProcessID, LineID, ReadTime)
values
(@sub_id, @proc_id, @line_id, @read_time)

if @@rowcount = 0 or @@error <> 0 -- Problems!

更新

如果触发器在插入时触发,则触发器中的错误严重性为:

  • < 10:将正常运行,@@error = 0
  • 11 到 16 之间:插入会成功,@@error != 0
  • 17、18:插入成功,执行停止
  • 19(带日志):插入将成功,执行将停止
  • > 20(带日志):插入不会成功,执行将停止

我通过在工作流表中添加触发器并测试各种严重性值来实现这一点,所以我不能轻易地说这将是所有环境中的确切情况:

alter trigger workflowtrig on workflow after insert as begin
    raiserror(13032, 20, 1) with log -- with log is necessary for severity > 18
end

太棒了,在那之后,我们对这个问题有了一些答案:

@@Error 可以在成功插入时为非零吗?

是的......但是,我不确定是否还有其他一系列事件可能导致这种情况,而且我没有足够的创造力来组合测试来证明这一点。希望其他人肯定知道。

我知道这一切都不是一个很好的答案,但是对于评论来说太大了,我认为它可能会有所帮助!

于 2012-10-10T20:00:06.893 回答
1

根据 T-SQL文档,这应该是不可能的。您也可以将其包装在 try/catch 中,以尝试捕获大多数错误。

您可能还需要考虑 SCOPE_IDENTITY() 未返回正确值或您认为的值的可能性。如果您在 Master.WorkflowEventProcessing 和 Master.ProcessLogging 表上有 FK,则尝试插入这些表时可能会收到 FK 错误,因为从 SCOPE_IDENTITY 返回的值不正确。

于 2012-10-10T19:54:59.927 回答