您的位置:程序门 -> ms-sql server -> 应用实例



自动生成号段的存储过程


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


自动生成号段的存储过程[已结贴,结贴人:hfyanzi]
发表于:2007-10-17 16:35:31 楼主
进销存系统:产品入库后自动为每个产品生成唯一的编号(共24位).
规则如下:产品号+流水号+供货商号+有效期(产品号为前12位,不够12位的在前面加&代替;流水号为系统自动生成的号码,长度为6位从1到999999,自然增长,号不重复,数字位数不到6位的用0补,如号35不足用0补货为000035;供货商号为3位,固定;有效期为三位固定).

比如说现在有个批产品,有一万个,用户存储过程如何生成这样的号段?号段生成后插入到别外一张表中,如果中间出错,退回真个过程。第二次进购同样的产品,号段接着之前的号使用不重得。

请各位高手指教!谢谢了。
发表于:2007-10-17 16:40:101楼 得分:20
sql code
declare @maxid int,@maxserial select @maxid=maxcast(编号 as int)),@maxserial=replicate'0',6-lenrtrim@maxid))) + rtrim@maxid) from tb select @maxserial
发表于:2007-10-17 16:40:442楼 得分:0
上面打掉了,补充一下
sql code
declare @maxid int,@maxserial varchar6)
发表于:2007-10-17 16:59:193楼 得分:0
楼上这个只是生成了一个流水号。生成后插入到表中,以及如何循环生成号码?因为一次性要生成的号码会很多。而且不能重复。
发表于:2007-10-17 17:13:464楼 得分:0
批量加多条?

declare   @maxid   int,@maxserial
select   @maxid=max(cast(编号   as   int))   from   tb
while   @maxid <999999
begin
        select   @maxserial=replicate('0',6-len(rtrim(@maxid+1)))   +   rtrim(@maxid+1)
        set   @maxid=@maxid+1
        --insert   newtb   (serial)   select   @maxserial
end
发表于:2007-10-17 17:17:125楼 得分:0
之前我是有三张表。如:
a:id       productid         flownum         ifuse
      自动           aaa                   1                   1
                      aaa                   2                   1
                      aaa                   3                   0
                      bbb                   1                   1

ifuser   0表未号未用过,1表示已经用过
b:id       productid         flowno
      自动           aaa               000001
                      aaa               000002
                      bbb               000001
最后生成插入到c中
c:   id           medno            
      自动         &&&&&&&&&aaa000001
                    &&&&&&&&&aaa000002
                    &&&&&&&&&bbb000001
发表于:2007-10-17 17:42:416楼 得分:0
实际上你的意思是在同   productid   的记录里查断号了.

查出所有断号,生成即可.   或者说,在   while   的循环中,每次再用个   exists   判断下就行了.
declare   @maxid   int,@maxserial  
select   @maxid=max(cast(编号   as   int))   from   tb  
while   @maxid   <999999  
begin  
        select   @maxserial=replicate(   '0   ',6-len(rtrim(@maxid+1)))   +   rtrim(@maxid+1)  
        set   @maxid=@maxid+1  
        if   not   exists   (select   1   from   a表   where   ifuse=1   and   flownum=cast(@maxserial   as   int))
                insert   newtb   (serial)   select   @maxserial  
end  

效率好点的就是先生成断号,再填充0和insert操作.
发表于:2007-10-17 17:51:577楼 得分:0
还可以是..
declare   @sql   varchar(8000)
create   table   #t(serial   varchar(6))
declare   @maxid   int,@maxserial   varchar   ,@i   int
select   @i=0

select   top   100   @i=@i+1,
@sql=isnull(@sql,'')   +   '   union   all   select   replicate(''0'',6-len('   +   rtrim(@i)   +   '))+   '''   +   rtrim(@i)   +   '''   ser   '   from   sysobjects   cross   join   syscolumns

select   @sql='('   +   stuff(@sql,1,10,'')   +   ')   a'
select   @sql='insert   #   select   ser   from   '+@sql   '   inner   join   你的表   b   on   ifused=0   and   cast(ser   as   int)=flownum)
EXEC(@sql)
select   *   from   #t

方法很多,不一一写了.
发表于:2007-10-17 18:34:438楼 得分:0
这是我写的存储过程,生成10000个号,但是花了10分钟。楼上请帮忙修改一下。

create   procedure   xxx
  as

set   nocount   on

declare   @maxid   int,@maxserial   varchar(6)   ,@i   int
set   @i=0
--select   @maxid=max(cast(flownum   as   int))   from   winshipflowifuser   where   productid='a'   and   ifuse=0
while   @i   <10000
begin  
        select   @maxid=max(flownum)   from   winshipflowifuser   where   productid='a'   and   ifuse=0
        select   @maxserial=replicate(   '0',6-len(rtrim(@maxid)))   +   cast(@maxid   as   varchar)  
        set   @maxid=@maxid+1  
        insert   winshipflow   (productid,flowno)   select   'a',@maxserial  
        insert   winshipflowifuser   (productid,flownum)   select   'a',@maxid
        update   winshipflowifuser   set   ifuse=1   where   productid='a'   and   flownum=(@maxid-1)
        set   @i   =@i   +1
end
go
发表于:2007-10-17 23:29:439楼 得分:0
你这样的写法,   生成100000个号,那么要执行
100000次   select   @maxid...   from  
100000次   select   @maxserial   ..from  
10...
约   500000   次数据表查询(select查询,insert查询和update查询)
能快就怪了.

改进建议
1,   先生成   000001-99999   这样的号放入临时表     这样只执行了简单的字符串处理
2,   用临时表连表去进行插入操作和更新操作     这样只执行了几次连表操作
效率应该是数量级的提升.
发表于:2007-10-18 09:16:1510楼 得分:0
楼上高手能不能给个示例,说明一下。谢了!
发表于:2007-10-18 17:40:5611楼 得分:0
???????
发表于:2007-10-19 19:19:5212楼 得分:0
高手?????????
发表于:2007-10-19 19:44:5213楼 得分:0
create   table   #(serail)


declare   @maxid   int,@maxserial    
select   @maxid=1
while   @maxid     <999999    
begin    
        select   @maxserial=replicate(     '0     ',6-len(rtrim(@maxid)))   +   rtrim(@maxid),@maxid=@maxid+1    
        insert   #   select   @maxserial    
end    

insert   你要插入的表(serail)   select   t.serail
from   #   t
left   join   你的a表   a
on   (t.serail=right('000000'   +   rtrim(a.flowno),6)   and   ifused=0)   or   a.id   is   null

随手敲的,只说了一下思路,没有细看代码.


快速检索

最新资讯
热门点击