在我转换的数据库中,我看到很多程序看起来像这样:
ALTER PROCEDURE DeleteSomething
@someinput
AS
DELETE
FROM [table name]
WHERE [several conditions are met]
然后我看到这些程序如下所示:
exec DeleteSomething @someinput
但是,没有错误处理或程序周围的任何事情。我对T-SQL不是很熟悉,所以我试图检查一下 - 如果这个查询失败会发生什么?如果找不到数据?如果条件不满足?如果传入的输入为空?
修改
这是我遇到的一个问题的另一个例子:
select @variable=field
from table join othertable on table.id = othertable.id
where table.id = someinput
同样,没有错误处理。据我所知,在Oracle中如果没有找到数据会抛出错误。除非检查了相应的@error变量,否则我在T-SQL中说它是否正确?
答案 0 :(得分:0)
是的 - 您认为程序将继续运行是正确的 - 忽略错误。除非声明(对于exec)在try catch块中。另一件需要考虑的事情是交易 - 是交易中的陈述。
关于问题的第二部分 - 我(几乎)确定输出参数在分配值之前保持不变。换句话说 - 如果没有您提供的具体示例 - 您将需要检查特定的SP以找出为参数分配值的位置。
希望这会对你有所帮助。
答案 1 :(得分:0)
1:不正确。当从外部程序调用存储过程并且在sql端出现问题时,sql会抛出错误。你在这里看到的是sql本身不会处理这个错误。调用软件可能忽略它,但错误是由调用者处理的 btw空结果集和未满足条件不是错误。
2:不确定,但找不到任何证据或文件。如果一个巨大的存储过程(数百行代码)在设置了值之后失败,则输出参数可能不为空。
答案 2 :(得分:-1)
尝试使用Begin Tran
,Commit Tran
和Rollback
BEGIN TRAN
Begin Tran
下面的查询受到影响,即如果@@ROWCOUNT
为>=1
,则使用COMMIT TRAN提交您的交易如果存在某些错误且行未受影响,请使用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)