业务单号自动增长的处理办法

问题:在实际业务处理中有些单号需要自动增长,但又不能用自增列代替
      eg:  P031106001   -- 第一位P表示采购单,031106表示日期,后三位是流水号。 

/* 1:创建测试用的表结构 */
create table tablename(pono char(10),b int)
go
/* 2:创建一个得到当前日期的视图,为下面的自字义函数作准备 */
create view vGetdate
as
  select getdate() as today
go
/* 3:用自定义函数来得到单号(因自定函数内不能用getdate()来得到当前日期,要用到上面的视图) */
create function getDH()
returns char(10)
As
begin
    declare @dh1 char(10),@dh2 char(10)
    select @dh1 = max(pono) from  tableName
    Set @dh1 = IsNull(@dh1,'P000000000') 
    select @dh2 = Left(@dh1,1) + right(convert(varchar(8),today,112),6) + '001' from vGetdate
    if @dh1 >= @dh2
    begin
        set @dh2 = left(@dh1,7) + right('000'+ cast(cast(right(@dh1,3) as int)+1 as varchar),3)
    end   
    return(@dh2)
end
go
/* 4:在字段默认值中填入 dbo.getdh() */
alter table tablename add constraint df_tablename_1 default(dbo.getdh()) for pono
-/* 5:测试:*/
insert tablename(b) values(1)
insert tablename(b) values(2)
Select * from tablename
-- 测试结果
pono       b          
---------- -----------
P031115001 1
P031115002 2
总结:此方法运用到了一些小技巧
1:用字段默认值来实现单号自增
2:用自定义函数来得到字段的默认值
3:因在自定义函数中不能用getdate()之类非确定的函数,用视图来得到当前日期

时间: 2024-09-12 02:50:32

业务单号自动增长的处理办法的相关文章

让系统自动生成入库单号

问题描述 我现在在做一个仓库管理系统,现在有一个问题,今天仓库进来一批产品,把这些产品入库让系统自动生成一个入库单号,并且这批产品的入库单号必须相同,下午在进来另一批产品,入库时系统自动生成另一个入库单号.这个如何在数据库实现或是在C#实现 解决方案 解决方案二:没说明白...解决方案三:你说的是生成批号吧,这个在c#里面实现比较简单点,用当前日期时间做批号,到时候看批号就知道是什么时候入库的解决方案四:一般都是用系统时间再加上其他标识码.解决方案五:楼主应该说的更详细些,帮顶!解决方案六:同一

创建主键或单号的存储过程

问题描述 如何建一个创建主键或者ID(单号)的存储过程或者函数 解决方案 解决方案二:createtableHYBG(IDintIDENTITY(1,1)PRIMARYKEY) 解决方案三:楼上的int有些限制,提供一个方案仅供参考,建一个ID表(IDDecimal),不要自动增长(或者是一个用时间format的字符串),写一个方法或者是存储过程,每次请求将ID+1或者是new一个datetime.now的新key,在方法内部用lock关键字防止ID重复解决方案四:存储过程不方便在这里写吧

SQL Server自动增长过大的问题

一.背景 我们遇到的问题如下图所示:自动增长无端端就按照这样的比例进行增长: (Figure1:问题所在) 尝试使用SSMS修改自动增长值,就会出现下面的错误: (Figure2:错误信息) 遇到上面的问题,我们需要解决两个问题: 1. 把数据文件收缩到一定范围内的值,腾出磁盘空间: 2. 重新设置自动增长的值,可以按照百分比,也可以使用指定的空间大小,我个人倾向使用n*1024M这样的值,仅供参考: 3. 如果有需要你也可以进行日志文件的收缩: 二.解决过程 1. 使用下面的脚本修改自动增长的

oracle11g-使用sql语句select插入数据时怎么用行号补0为流水号做完单号保存

问题描述 使用sql语句select插入数据时怎么用行号补0为流水号做完单号保存 使用select语句像某个表中插入数据,表的单号要为该语句的ItemCode的值+5位流水号.流水号的规则是查询出来的"RowNum"的值自动补0为5为流水号.怎么出入,查询数据如图 解决方案 新增一列numerical order 类型为字符串 然后写个方法计算numerical order ,insert进去. 但只用sql语句的话,还没想到. 解决方案二: 试试这个: select itemcode

SQL Server 2012 自动增长列,值跳跃问题

原文:SQL Server 2012 自动增长列,值跳跃问题   介绍 从 SQL Server 2012 版本开始, 当SQL Server 实例重启之后,表格的自动增长列的值会发生跳跃,而具体的跳跃值的大小是根据增长列的数据类型而定的.如果数据类型是 整型(int),那么跳跃值为 1000:如果数据类型为 长整型(bigint),那么跳跃值为 10000.从我们的项目来看,这种跳跃问题是不能被接受的,尤其是展示在客户端的时候.这个奇怪的问题只在 SQL Server 2012 及更高的版本中

使用<c:forEach 遍历后台传来的数据成table,删除行后怎么确保行号自动排序?

问题描述 使用<c:forEach 遍历后台传来的数据成table,删除行后怎么确保行号自动排序? 1C 这是开头的部分: <tbody id=""add_OmsPurchaseCheck_table""> <c:if test=""${fn:length(OmsPurchaseCheckModelList) > 0 }""> <c:forEach items=""

使用hibernater的save添加oracle自动增长错误求救!

问题描述 <hibernate-mapping><classname="com.showtime.blog.entity.Tuser"table="TUSER"schema="SHOWTIME"><idname="id"type="java.lang.Integer"><columnname="ID"precision="22"

深入Mysql,SqlServer,Oracle主键自动增长的设置详解_Mysql

1.把主键定义为自动增长标识符类型MySql在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: 复制代码 代码如下: create table customers(id int auto_increment primary key not null, name varchar(15));insert into customers(name) values("name1"),("name2");select id fr

mysql把主键定义为自动增长标识符类型_Mysql

1.把主键定义为自动增长标识符类型 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: create table customers(id int auto_increment primary key notnull, name varchar(15)); insert into customers(name) values("name1"),("name2"); 一旦把id设为auto_increment类型,my