求一生成主键的存储过程?
不想用系统的自动增加列,希望得到如下的主键
年月日小时分秒毫秒 +六位的随机数
效果如下
05040111245227uiykht
请高手帮忙,谢谢
问题点数:100、回复次数:15Top
1 楼pbsql(风云)回复于 2005-04-01 13:30:55 得分 0
年月日小时分秒毫秒 +六位的随机数
那样是会有重复的,用uniqueidentifier类型,newid()Top
2 楼jinjazz(近身剪)回复于 2005-04-01 13:31:03 得分 10
select convert(char(8),getdate(),112)+
replace(convert(char(12),getdate(),114),':','')+
char(floor((rand()+1)*65))+
char(floor((rand()+1)*65))+
char(floor((rand()+1)*65))+
char(floor((rand()+1)*65))+
char(floor((rand()+1)*65))+
char(floor((rand()+1)*65))Top
3 楼libin_ftsafe(子陌红尘:TS for Banking Card)回复于 2005-04-01 13:38:02 得分 10
--创建
create procedure p_srl
as
select (convert(char(6),getdate(),12) +
replace(convert(char(12),getdate(),14),':','') +
right(newid(),6))
--执行
exec p_srlTop
4 楼hsj20041004(光芒)回复于 2005-04-01 13:42:23 得分 10
主键怎么可以用随机数,你可以在后面加上六位的流水号就好了
后者你可以后面不用加流水号,因为在1毫秒同时有俩个用户申请的机率为0
select convert(char(8),getdate(),112)+replace(convert(char(8),getdate(),114),':','') +'000001'Top
5 楼zjcxc(邹建)回复于 2005-04-01 13:57:47 得分 50
--主键用随机数难以保证唯一,在生成主键上要多做校验工作
--处理示例
--创建一个视图,生成编号
create view v_getNo
as
select No=convert(char(6),getdate(),12)
+replace(convert(varchar(12),getdate(),14),':','')
+right(newid(),6)
go
--创建一个函数,目的是得到不重复的一个编号
create function f_No() returns char(21)
as
begin
declare @re char(21)
select @re=No from v_getNo
while exists(select * from tb where bh=@re)
select @re=No from v_getNo
return(@re)
end
go
--创建表,使用这具函数
create table tb(bh char(21) primary key default dbo.f_no(),name varchar(10))
insert tb(name) values('张三')
insert tb(name) values('李三')
select * from tb
go
--删除测试
drop table tb
drop view v_getno
drop function f_no
/*--结果
bh name
--------------------- ----------
0504011356565904832EF 李三
050401135656590EF57B2 张三
(所影响的行数为 2 行)
--*/Top
6 楼ghost_old(PB中级程序员)回复于 2005-04-01 14:00:16 得分 0
谢谢大家!
主键用随机数应该是可以的,我看过其他国外的大型系统也是这样做的。
请教 libin_ftsafe(子陌红尘)
想在另外一个存储过程中
怎么在另外一个存储过程中调用 exec p_srl
比如
declare @a_id char(20)
select @a_id = exec p_srl
这样不行,应该怎么写呢?不好意思,谢谢帮忙
Top
7 楼zjcxc(邹建)回复于 2005-04-01 14:02:19 得分 0
--建立用流水号,这样不必为校验生成的编号是否重复而浪费时间
--处理示例
--创建一个视图,得到当前日期信息
create view v_getdate
as
select dt=convert(char(6),getdate(),12)
+replace(convert(varchar(12),getdate(),14),':','')
go
--创建一个函数,取得新编号
create function f_No() returns char(21)
as
begin
declare @re char(15)
select @re=dt from v_getdate
return(
select @re+right(1000001+isnull(right(max(bh),6),0),6)
from tb
where bh like @re+'%')
end
go
--创建表,使用这具函数
create table tb(bh char(21) primary key default dbo.f_no(),name varchar(10))
insert tb(name) values('张三')
insert tb(name) values('李三')
select * from tb
go
--删除测试
drop table tb
drop view v_getdate
drop function f_no
/*--结果
bh name
--------------------- ----------
050401140128590000001 张三
050401140128590000002 李三
(所影响的行数为 2 行)
--*/Top
8 楼ghost_old(PB中级程序员)回复于 2005-04-01 14:02:19 得分 0
邹大哥,你太厉害了,真是俺们的偶像,
来来来, 啵 ! 亲一口 :)Top
9 楼ghost_old(PB中级程序员)回复于 2005-04-01 14:02:29 得分 0
邹大哥,你太厉害了,真是俺们的偶像,
来来来, 啵 ! 亲一口 :)Top
10 楼YangYuWeb(飘邈...)回复于 2005-04-01 14:05:51 得分 0
强Top
11 楼yesyesyes()回复于 2005-04-01 17:16:55 得分 10
replace(replace(replace(replace(convert(varchar(22),getdate(),121),' ',''),':',''),'-',''),'.','')+left(newid(),6)Top
12 楼ghost_old(PB中级程序员)回复于 2005-04-01 19:29:57 得分 0
谢谢大家,待会揭帖
请问
怎么在另外一个存储过程中调用 exec p_srl
比如
declare @a_id char(20)
select @a_id = exec p_srl
这样不行,应该怎么写呢?不好意思,谢谢帮忙
Top
13 楼Hopewell_Go(好的在后頭﹗希望更好﹗﹗)回复于 2005-04-01 21:43:02 得分 10
我在這里說一點關于CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
關于expression 是datatime時style的含意﹕
1 mm/dd/yy
2 yy.mm.dd
3 dd/mm/yy
4 dd.mm.yy
5 dd-mm-yy
6 dd mon yy
7 Mon dd, yy
8 hh:mm:ss
10 mm-dd-yy
11 yy/mm/dd
12 yymmdd
14 hh:mi:ss:
Top
14 楼zjcxc(邹建)回复于 2005-04-02 13:38:07 得分 0
"怎么在另外一个存储过程中调用 exec p_srl "
建议用函数,如果用存储过程,应该用返回参数Top
15 楼ghost_old(PB中级程序员)回复于 2005-04-02 17:44:25 得分 0
谢谢邹老大,揭帖了!Top




