================================================== -- 名称:得到单据流水号 -- 实现功能:取得对应表的计数器,实现流水号功能. -- 调用示例:select f_lt_getorderno(fid) as fid, * from tab1 t1 left outer join t_orderlist t2 on t1.ftabid = t2.fid ================================================== create table t_orderlist( fid int identity (1, 1) not null, finccount int -- 计数器 ) create function f_lt_getorderno(@id int) as return varchar(32) declare @orderno int select @orderno = finccount from t_orderlist where fid = @id -- 取得编号后,计数器加1 update t_orderlist set finccount = finccount +1 -- 函数中不允许执行update,这种情况要怎么处理. returns @orderno -- 系统单据表,存放系统所以业务单据列表,存有生成流水号计数器 create table t_orderlist( fid int identity (1, 1) not null, finccount int -- 计数器 forder varchar(30) not null ) -- 系统业务单据,存放企业日常业务数据,具体每单有一个单据流水号 create table t_order( fid int identity (1, 1) not null, fnumber varchar(40), -- 单据流水号 forderinfo varchar(30) ) -- 现系统要求自动运算,将运算后的数据填充到t_order业务表中.填充时各记录要生成不同的单据流水号.我原先的实现想法是用存储过程: create procedure p_onlyc @codec varchar(48) output as declare @onlyc varchar(48) ,@finccount integer -- 取出当前单据流水号 select @finccount=finccount from t_orderlist where fid=@codec -- 流水号加1 select @finccount = @finccount +1 update t_orderlist set finccount = @finccount where fid= @codec -- 组织各个编码 select @onlyc = @codec + '-' + @onlyc select @codec = @onlyc; select @onlyc as fnumber -- print @codec go 但这程方法不能在select语句运算出的结果中调用.如前面写的select p_onlyc(fid) as 流水号, * from (select sum(..) from tab..) tab1 所以我想用函数,但函数里又没办法执行递增流水号: create function f_lt_getorderno(@id int) as return varchar(32) declare @orderno int select @orderno = finccount from t_orderlist where fid = @id -- 取得编号后,计数器加1 update t_orderlist set finccount = finccount +1 -- 函数中不允许执行update returns @orderno create procedure n_getbillno @billtype char(2),--单据类型 @billoutno nvarchar(50) output as begin declare @nowno int declare @date char(10) declare @symbol nvarchar(10) declare @errormsg nvarchar(200) set nocount on begin tran --设定延时 set lock_timeout000 --取当前序号 select @nowno=fnumber,@symbol=fcode,@date=convert(char(8),fdate,112) from n_billno with(xlock) where fcode=@billtype if @@error<>0 begin set @errormsg='数据被锁定,请求超时!' goto failed end --是否是新的一月 if convert(char(8),getdate(),112)<>@date set @nowno=1 else set @nowno=@nowno+1 --更新当前序列号和设置最后更新日期 update n_billno set fnumber=@nowno,fdate=getdate() where fcode=@billtype if @@error<>0 begin set @errormsg='更新外部序列号失败!' goto failed end --取得单号 set @billoutno=ltrim(@symbol)+convert(char(8),getdate(),112)+right(('0000'+convert(varchar,@nowno)),4) goto succeed failed: raiserror(@errormsg,16,1) rollback tran set nocount off return 1 succeed: commit tran set nocount off return 0 end go |