日期:2014-05-19  浏览次数:20468 次

简单问题,求一简单的流水号生成
比如是07年,那么就是
0700001S
0700002S
0700003S
........


如果换08年,那么就变成

0800001S
0800002S

但是可以允许换到以前的年份

比如是2005年
那么应该先检查改年度流水号最后一个
比如是
0500234S

下面添加该年的信息就应该是
0500235S
0500236S

这样应该怎么实现,是否要建一个表来控制,请指教。

------解决方案--------------------
select left(cast(left((select max(号码字段) from table where 号码字段 like right(year(getdate()),2)+ '% '),7) as int)+1+10000000,7)+ 'S '
------解决方案--------------------
if object_id( 'ta ')> 0 drop table ta
create table ta
(
sid int identity(1,1) primary key,
Add_Date datetime,
cid as right(year(Add_Date),2)+right(sid+100000,len(sid+100000)-1)+ 'S '
)

--插入测试数据1
insert into ta select getdate()
--结果
select * from ta
/*
sid Add_Date cid
----------- ----------------------- -----------------
1 2007-06-08 13:28:54.090 0700001S
*/

--插入测试数据2
insert into ta select '2005-10-10 '
--结果
select * from ta
sid Add_Date cid
----------- ----------------------- -----------------
1 2007-06-08 13:28:54.090 0700001S
2 2005-10-10 00:00:00.000 0500002S

drop table ta

--不知楼主看明白没
------解决方案--------------------
方案:
原理:在一张表中保存生成的流水号,考虑到数据长度问题,尽量使用varchar.一个存储过程负责生成,代码如下:
CREATE TABLE [dbo].[SYS_PRIMARYKEY](
[ROW_ID] [varchar](16) COLLATE Chinese_PRC_CI_AS NOT NULL,
[CREATER] [varchar](16) COLLATE Chinese_PRC_CI_AS NULL,
[CREATER_DATE] [datetime] NULL,
[MODIFIER] [varchar](16) COLLATE Chinese_PRC_CI_AS NULL,
[MODIFIED_DATE] [datetime] NULL,
[MODIFIED_NUM] [int] NULL,
[REMARK] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL,
[TABLE_NAME] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[ROW_SERIOUS] [varchar](16) COLLATE Chinese_PRC_CI_AS NULL,
[as_today] [char](10) COLLATE Chinese_PRC_CI_AS NULL,
[As_department_id] [varchar](16) COLLATE Chinese_PRC_CI_AS NULL,
[As_group_id] [varchar](16) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_SYS_PRIMARYKEY] PRIMARY KEY CLUSTERED
(
[ROW_ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

存储过程:

/*
功能:产生流水号
参数说明:
@as_table_name 需要流水号的对象(数据表或者任意名称)
@as_reset_flag 前缀格式 Y---yyyy
M---yyyymm
D---yyyymmdd
@as_reset_flag也可以设置成任意意义的前缀

调用可返回生成的序列号

-------------------------
崔跃兵 Jun 8 2007
*/
create proc [dbo].[pro_get_id_sp] @as_table_name varchar(50), @as_reset_flag varchar(16)
as
declare @ld_value bigint
declare @table_exist numeric
declare @row_id varchar(16)
declare @ls_year varchar(10)
declare @as_today char(8)
declare @ls_seqid varchar(32)
declare @ls_return varchar(32)
declare @ls_prefix varchar(22)

Begin

if @as_reset_flag = 'Y '
set @ls_year = convert(varchar(4),getdate(),112)
if @as_reset_flag = 'M '
set @ls_year = convert(varchar(6),getdate(),112)
if @as_reset_flag = 'D '
set @ls_year = convert(varchar(8),getdate(),112)
else
set @ls_year = @as_reset_flag+convert(varchar(8),getdate(),112)

set @as_today=convert(char(8),getdate(),112)

SELECT @as_table_name=UPPER(@as_table_name)

begin tran
if exists