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,它对原始代码来说是一个明显的问题,很容易修复。