没有错误处理结果

时间:2014-11-28 11:43:46

标签: sql-server tsql stored-procedures

在我转换的数据库中,我看到很多程序看起来像这样:

ALTER PROCEDURE DeleteSomething
    @someinput
AS
    DELETE
    FROM [table name]
    WHERE [several conditions are met]

然后我看到这些程序如下所示:

exec DeleteSomething @someinput  

但是,没有错误处理或程序周围的任何事情。我对T-SQL不是很熟悉,所以我试图检查一下 - 如果这个查询失败会发生什么?如果找不到数据?如果条件不满足?如果传入的输入为空?

  1. 我是否正确地说所有这些情况程序将继续正常,因为@@ error还没有被检查过?
  2. 同样,如果输出参数也被传递给过程并且失败了,我是否正确地说它的值为null,因为它没有被分配?
  3. 修改

    这是我遇到的一个问题的另一个例子:

    select @variable=field     
    from table join othertable on table.id = othertable.id    
    where table.id = someinput
    

    同样,没有错误处理。据我所知,在Oracle中如果没有找到数据会抛出错误。除非检查了相应的@error变量,否则我在T-SQL中说它是否正确?

3 个答案:

答案 0 :(得分:0)

是的 - 您认为程序将继续运行是正确的 - 忽略错误。除非声明(对于exec)在try catch块中。另一件需要考虑的事情是交易 - 是交易中的陈述。

关于问题的第二部分 - 我(几乎)确定输出参数在分配值之前保持不变。换句话说 - 如果没有您提供的具体示例 - 您将需要检查特定的SP以找出为参数分配值的位置。

希望这会对你有所帮助。

答案 1 :(得分:0)

1:不正确。当从外部程序调用存储过程并且在sql端出现问题时,sql会抛出错误。你在这里看到的是sql本身不会处理这个错误。调用软件可能忽略它,但错误是由调用者处理的 btw空结果集和未满足条件不是错误。

2:不确定,但找不到任何证据或文件。如果一个巨大的存储过程(数百行代码)在设置了值之后失败,则输出参数可能不为空。

答案 2 :(得分:-1)

尝试使用Begin TranCommit TranRollback

  1. 首先使用BEGIN TRAN
  2. 开始您的交易
  3. 如果某些行已根据Begin Tran下面的查询受到影响,即如果@@ROWCOUNT>=1,则使用COMMIT TRAN提交您的交易
  4. 如果存在某些错误且行未受影响,请使用ROLLBACK来回滚您的交易

    ALTER PROCEDURE DeleteSomething
        @someinput
    AS
    BEGIN TRAN
        DELETE
        FROM [table name]
        WHERE [several conditions are met]
    IF @@Trancount>=1
    Begin
      COMMIT TRAN
    End
    ELSE
    BEGIN
      Rollback
    END
    IF @@Errorcount<>0
      ROLLBACK TRAN
      Declare @ErrMsg Nvarchar(8000),@ErrSeverity int
      Select @ErrMsg=ERROR_MESSSAGE(),@ErrSeverity=ERROR_SEVERITY()
      Raiserror(@ErrMsg,@ErrSeverity,1)