Sql server SQL Server捕获异常并继续
我必须遵循以下程序:Sql server SQL Server捕获异常并继续,sql-server,Sql Server,我必须遵循以下程序: alter procedure sp_insert_cities ( @txt_nome_cidade varchar(300), @txt_nome_estado varchar(150) = null, @txt_pais varchar(150) = null, @int_id_cidade int output ) as begin //Here an exception may occur
alter procedure sp_insert_cities
(
@txt_nome_cidade varchar(300),
@txt_nome_estado varchar(150) = null,
@txt_pais varchar(150) = null,
@int_id_cidade int output
)
as
begin
//Here an exception may occur
insert into tb_cidades values(
@txt_nome_cidade,
@txt_nome_estado,
@txt_pais)
set @int_id_cidade = @@identity
//Here i want to catch exception and continue executing the proc
if(@@error <> 0)
begin
select @int_id_cidade = int_id_cidade
from tb_cidades
where
txt_nome_cidade = @txt_nome_cidade
end
alter程序sp\u insert\u
(
@txt_nome_cidade varchar(300),
@txt_nome_estado varchar(150)=空,
@txt_pais varchar(150)=空,
@int_id_cidade int输出
)
作为
开始
//这里可能会出现例外情况
在tb_cidades值中插入(
@txt_nome_cidade,
@txt_nome_estado,
@txt_pais)
设置@int\u id\u cidade=@@identity
//这里我想捕获异常并继续执行proc
如果(@@0错误)
开始
选择@int\u id\u cidade=int\u id\u cidade
来自tb_cidades
哪里
txt_nome_cidade=@txt_nome_cidade
结束
在if(@@error 0)
行之后,我想继续执行代码,即使有任何错误,但是SQL会向我的应用程序抛出一个异常,并且if条件中的代码不会执行
有什么想法吗?下面将尝试运行您的命令。您可以将要运行的任何内容放入CATCH块中,该块只有在发生错误时才会执行。捕获后的剩余代码将有错误或无错误地运行
BEGIN TRY
insert into tb_cidades values(
@txt_nome_cidade,
@txt_nome_estado,
@txt_pais)
set @int_id_cidade = @@identity
END TRY
BEGIN CATCH
select @int_id_cidade = int_id_cidade
from tb_cidades
where
txt_nome_cidade = @txt_nome_cidade
END CATCH
BEGIN TRY
insert into tb_cidades values(
@txt_nome_cidade,
@txt_nome_estado,
@txt_pais)
set @int_id_cidade = @@identity
END TRY
BEGIN CATCH
PRINT 'Error occurred'
END CATCH
if(@@error <> 0)
begin
select @int_id_cidade = int_id_cidade
from tb_cidades
where
txt_nome_cidade = @txt_nome_cidade
end
开始尝试
在tb_cidades值中插入(
@txt_nome_cidade,
@txt_nome_estado,
@txt_pais)
设置@int\u id\u cidade=@@identity
结束尝试
开始捕捉
打印“发生错误”
端接
如果(@@0错误)
开始
选择@int\u id\u cidade=int\u id\u cidade
来自tb_cidades
哪里
txt_nome_cidade=@txt_nome_cidade
结束
如果您不想使用@@identity,那么如果您向表中添加触发器并将其插入到其他表中,这是一个不安全的命令,它将破坏您的数据完整性。改为使用输出或作用域\标识()。@@identity有什么问题?如何使用输出?@@identity提供生成的最后一个标识值,它不一定是您想要的标识值。如果tb_cidades上有一个触发器插入到历史/日志表中,并且该触发器上有一个标识列,那么您将获得该标识值,而不是为tb_cidades表生成的标识值。通过使用SCOPE_IDENTITY()可以获得在当前“SCOPE”中生成的标识值,该值将位于tb_cidades上。要除去@IDENTITY,请使用SCOPE_IDENTITY()@@IDENTITY v。SCOPE_IDENTITY()不是问题的一部分(尽管我同意你的观点),即使OP没有询问@@IDENTITY,它对原始代码来说是一个明显的问题,很容易修复。