将序列的值返回到先前的值

时间:2017-12-03 10:44:26

标签: sql-server

为了生成ID并将其作为参数传递给另一个存储过程,有一个递增的序列,在过程中就是这样的:

 declare @ID int

 select @ID = next value for seq1

 execute proc_insert @ID = @ID,...

proc_insert的执行失败时,问题就出现了,所以我们希望序列的值返回到先前的值。

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

您的方案确实不明确。 可能是UDF,因此产生相应的sequnce。

如果您使用的是序列,那么您可以这样做。

假设我的序列定义为,

CREATE SEQUENCE [dbo].[CountBy1] 
 AS [bigint]
 START WITH 1
 INCREMENT BY 1
 MINVALUE -9223372036854775808
 MAXVALUE 9223372036854775807
 CACHE 
GO

然后你的proc_insert应该返回指示pass / fail的输出参数,

声明@ID int  选择@ ID = seq1的下一个值  执行proc_insert @ ID = @ ID,@ Outputparameter = @ Outputparameter ...   - 如果proc_insert失败,请在此处查看

if(@Outputparameter=0)-- 0 means failed
 begin
 declare @Sql varchar(2000)=
    'ALTER SEQUENCE dbo.CountBy1
    RESTART WITH '+@ID+''

    Exec(@Sql)
 end

你应该正确使用Begin Trans并接受Begin Try的帮助。

此外,您应该使用sp_executesql