为了生成ID并将其作为参数传递给另一个存储过程,有一个递增的序列,在过程中就是这样的:
declare @ID int
select @ID = next value for seq1
execute proc_insert @ID = @ID,...
当proc_insert
的执行失败时,问题就出现了,所以我们希望序列的值返回到先前的值。
如何解决此问题?
答案 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