【SQL Server】存储过程动态调用sequence
需求:不同的分组返回自己指定的流水号,跨年后,从1开始。流水号中前几位是该分组的组编码。
实现这个需求,方法有很多,应用把这个活儿交给了数据库,因为数据库处理起来更方便些,应用使用起来也就不用管太多问题了。
在数据库层面实现,显然sequence是比较好的方法。这个需求最早是在Oracle数据库上做的,实现起来非常容易,创建一个function,这个function调用一个procedure,procedure中通过动态SQL得到组的编码,再查询sequence,sequence的命名规则是:seq_+当前年份+组编码。如果存在,则直接返回sequence的值,如果不存在,则抛出异常,在异常处理部分创建该sequence。
oracle实现起来很容易,在sqlserver中,对于对sqlserver不了解的人来说,还是有些小麻烦。在此把过程中涉及到的代码粘贴在此。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
……前面略…… ## 拼接当前用户“御用”的sequence名字 SET @v_seqname = 'seq_aa_' + @v_year + '_' + @v_code ## 拼接一个查询sequence的SQL语句,语句中包含了一个变量 SET @v_sql = 'select @v_pn = next value for '+ @v_seqname begin try ## 动态执行SQL,将结果赋予 @v_sn 输出 exec sp_executesql @v_sql,N'@v_pn int output',@v_sn output end try begin catch ## 当出现异常,按照sequence的名字创建一个sequence,然后再返回该值 set @v_create = 'create sequence dbo.' + @v_seqname + ' as int start with 1' ## 没有参数的动态SQL,可以用如下方式执行。 exec (@v_create) exec sp_executesql @v_sql,N'@v_pn int output',@v_sn output end catch ……后面略…… |