CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

求一生成主键的存储过程?

楼主ghost_old(PB中级程序员)2005-04-01 13:19:33 在 MS-SQL Server / 基础类 提问

不想用系统的自动增加列,希望得到如下的主键  
   
  年月日小时分秒毫秒   +六位的随机数  
   
  效果如下  
   
  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

相关问题

  • 求主细表主键id添加的存储过程
  • 联合主键的分页存储过程
  • 用存储过程动态生成表
  • 使用PD怎样生成存储过程?
  • 怎么用存储过程生成一个动态字段表???
  • 一个insert into语句生成的存储过程
  • 求一动态生成单据编号的存储过程?
  • 存储过程里动态生成试图
  • 生成随机字母数字的存储过程
  • 关于用存储过程生成2006年周表的问题

关键词

  • 存储过程
  • 函数
  • srl
  • 随机数
  • 生成
  • 主键
  • getdate
  • yy
  • 流水号
  • rand

得分解答快速导航

  • 帖主:ghost_old
  • jinjazz
  • libin_ftsafe
  • hsj20041004
  • zjcxc
  • yesyesyes
  • Hopewell_Go

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo