求自动编号产生算法和编码

清天灵月 2011-11-19 01:15:43
求自动编号产生算法和编码!各位大侠帮帮忙!我尝试了很久,还是不行,菜鸟无奈啊!

要求:1.改编号为SQL表中KEY;
2.格式为“当前时间+自动产生的编码” 例:201111190001 ;20111119为时间,0001为自动产生的编码!
3.插入时,自动产生!

背景:小弟学生一个,在做一个delphi+SQL C/S物料的管理系统,在入仓,出仓操作时,往表中添加由delphi前台输入的记录,“自动编号”就是用在这了,就是那个入仓表的 编号 要根据时间来产生!

在线等,大侠降临!

...全文
179 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
清天灵月 2011-11-19
  • 打赏
  • 举报
回复
嗯,知道了,结贴了!
中国风 2011-11-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chinacyr 的回复:]

引用 8 楼 chinacyr 的回复:

引用 3 楼 roy_88 的回复:

SQL code
if object_id ( 'T' ) is not null
drop table T
go
create table T(id varchar (20) primary key ,name varchar ( 10 ))

go
……
[/Quote]

我测试的环境是SQL2008,不需要指定

SQL2000需要指定一个值
清天灵月 2011-11-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 chinacyr 的回复:]

引用 3 楼 roy_88 的回复:

SQL code
if object_id ( 'T' ) is not null
drop table T
go
create table T(id varchar (20) primary key ,name varchar ( 10 ))

go
if OBJECT_ID('tr_T_inser……
[/Quote]
我SB了! 那个ID值 无论传什么进去, 都会被触发更新,给个1 值 解决问题!
清天灵月 2011-11-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 roy_88 的回复:]

SQL code
if object_id ( 'T' ) is not null
drop table T
go
create table T(id varchar (20) primary key ,name varchar ( 10 ))

go
if OBJECT_ID('tr_T_insert') is not null
……
[/Quote]

大侠,会产生错误!
服务器: 消息 233,级别 16,状态 2,行 1
表 'T' 中的列 'id' 不能为空。
因为表'T'已经有约束,id varchar (20) primary key
如何解决啊!
中国风 2011-11-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chinacyr 的回复:]

引用 2 楼 xiaolinyouni 的回复:

即便是你所说的"自动"产生,也不是系统自己生成,而是由你自己计算,
如果你的UI界面需要动态生成这样的编号,你可以遍历当前表,
取201111190001....201111190059这个字段的最大的数的后四位如0059,
然后用格式化后的时间字符串"20111119"连接0059+1(即0060)="201111190060"
……
[/Quote]
在触发器里取系统日期生成的
快溜 2011-11-19
  • 打赏
  • 举报
回复
写个函数,去当前时间跟编号规则拼字符串,需要一个编号规则表
清天灵月 2011-11-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xiaolinyouni 的回复:]

即便是你所说的"自动"产生,也不是系统自己生成,而是由你自己计算,
如果你的UI界面需要动态生成这样的编号,你可以遍历当前表,
取201111190001....201111190059这个字段的最大的数的后四位如0059,
然后用格式化后的时间字符串"20111119"连接0059+1(即0060)="201111190060"
当然,虽然你的表中,这个字段完全可以做主键,
但是你的……
[/Quote]
大侠,格式化后的时间字符串"20111119" 如何产生啊!
中国风 2011-11-19
  • 打赏
  • 举报
回复
中国风 2011-11-19
  • 打赏
  • 举报
回复
if   object_id ( 'T' )  is   not   null 
drop table T
go
create table T(id varchar (20) primary key ,name varchar ( 10 ))

go
if OBJECT_ID('tr_T_insert') is not null
drop trigger tr_T_insert
go
-- 用触发器完成
create trigger tr_T_insert on T
instead of insert
as
begin
declare @i int ,@dt varchar(8)
set @dt=convert(varchar(8),getdate(),112)
select * into # from inserted
select
@i = isnull (max (right(id,4)), 0 )
from T
where left(ID,8)=@dt
update #
set id = @dt+right ( 10000 + @i, 4 ), @i = @i + 1
insert T
select * from #
end



go
-- 测试

insert T (Name)
select 'a' union all
select 'b'

select * from T
/*
id name
201111190001 a
201111190002 b
*/
苦苦的潜行者 2011-11-19
  • 打赏
  • 举报
回复
即便是你所说的"自动"产生,也不是系统自己生成,而是由你自己计算,
如果你的UI界面需要动态生成这样的编号,你可以遍历当前表,
取201111190001....201111190059这个字段的最大的数的后四位如0059,
然后用格式化后的时间字符串"20111119"连接0059+1(即0060)="201111190060"
当然,虽然你的表中,这个字段完全可以做主键,
但是你的表结构最好还是有一个由系统自动的自增列最好,方便操作和查询.
  • 打赏
  • 举报
回复
GUID

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧