当前位置: 首页 > news >正文

sql 用户定义函数自动生成自增长ID

  1 -- -流动人员号自动编号函数,由区域代码-年月日-序列号组成的 每日新序号
  2 -- -geovindu@163.com 涂聚文 www.dusystem.com
  3 if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[GetDayFloatingID] ' and  xtype  in  (N ' FN ' , N ' IF ' , N ' TF ' ))
  4 drop   function   [ dbo ] . [ GetDayFloatingID ]
  5 GO
  6 CREATE   FUNCTION  GetDayFloatingID( @headStr   nvarchar ( 10 ), @date   datetime )
  7 RETURNS   nvarchar ( 50 )
  8 BEGIN
  9 declare    @oid2   nvarchar ( 50 )
 10 declare   @oid   nvarchar ( 50 )
 11 declare   @day   nvarchar ( 2 )
 12 declare   @month   nvarchar ( 2 )
 13 declare   @year   nvarchar ( 4 )
 14 declare   @ym   nvarchar ( 8 )
 15 set   @day = day ( @date )
 16 if   len ( @day ) = 1
 17      set   @day = ' 0 ' + @day   -- 使日为两位长
 18 set   @month = month ( @date )
 19 if   len ( @month ) = 1
 20      set   @month = ' 0 ' + @month   -- 使月为两位长
 21 -- set @year=right(convert(nvarchar,year(@date)),2)
 22 set   @year = convert ( nvarchar , year ( @date ))
 23 set   @ym = @year + @month + @day   -- 组成年月日字符
 24
 25 -- 格式BJ200808200001
 26 if   exists ( select   *   from  Populations)
 27 begin
 28      select    top   1   @oid2 = FloatingID  from  Populations   order   by  FloatingID  desc   -- 获取最后一条的编号,一定要有id,并且自动生成的,倒排序
 29 end
 30 else
 31 begin
 32      set   @oid2 = @headStr + @ym + ' 00000 '   -- 没有记录是默认为今天
 33 end
 34
 35 -- 流水号不是本月的,重新开始一个新的流水号
 36 if   convert ( nvarchar , left ( @oid2 , 6 )) <> @headStr + @ym
 37 begin
 38 -- 用本月的年月号开始
 39      set   @oid2 = @headStr + @ym + ' 00000 '
 40 end
 41
 42 declare   @str   nvarchar ( 50 -- 临时流水号
 43
 44 set   @str = convert ( nvarchar ,( convert ( int , right ( @oid2 , 4 )) + 1 ))  -- 流水号加一
 45 while  ( 5 - len ( @str ) > 0 )
 46 begin
 47       set   @str = ' 0 ' + @str     
 48 end
 49 set   @oid2 = @headStr + @ym + @str
 50 -- print @oid2
 51
 52 -- 如果该流水号已经存在,则重新获取
 53 while   exists ( select   *   from  Populations  where  FloatingID = @oid2 )
 54 begin
 55     
 56      set   @str = convert ( nvarchar ,( convert ( int , right ( @oid2 , 5 )) + 1 ))  -- 流水号加一
 57      while  ( 5 - len ( @str ) > 0 )
 58      begin
 59           set   @str = ' 0 ' + @str     
 60      end
 61      set   @oid2 = @headStr + @ym + @str
 62 --      print @oid2
 63 end
 64
 65 set   @oid = convert ( nvarchar , @oid2 )
 66 -- print 'UL'+convert(nvarchar,year(getdate()))+convert(nvarchar,month(getdate()))+@str
 67 RETURN   @oid
 68 END
 69 GO
 70 -- 测试
 71 DECLARE   @S   varchar ( 30 )
 72 select   @S = dbo.GetDayFloatingID( ' 02 ' , getdate ())
 73 select   @s   as   ' 流动编号 '
 74
 75 -- 按月自动增长
 76 -- 如果当月,没有记录号,开始创建,如果有,在此基此上加1,以月新增长序列号
 77 if   exists  ( select   *   from  dbo.sysobjects  where  id  =   object_id (N ' [dbo].[GetMonthFloatingID] ' and  xtype  in  (N ' FN ' , N ' IF ' , N ' TF ' ))
 78 drop   function   [ dbo ] . [ GetMonthFloatingID ]
 79 GO
 80 CREATE   FUNCTION  GetMonthFloatingID( @headStr   nvarchar ( 10 ), @idate   datetime )
 81 RETURNS   nvarchar ( 50 )
 82 BEGIN
 83 -- @idate datetime,@headStr varchar(10),
 84 declare   @fid   varchar ( 100 ), @dat   varchar ( 20 ), @ym   varchar ( 20 ), @str   nvarchar ( 50 ), @olde   varchar ( 30 ), @y   varchar ( 10 ), @m   varchar ( 10 ), @d   varchar ( 10 )
 85 -- set @headStr='01'
 86 -- set @idate=cast('2009-04-3' as datetime)              --getdate()
 87 -- set @ym=cast(getdate() as varchar(30))
 88 -- 找到当月最大的值
 89 select   top   1   @fid = FloatingID  from  Populations 
 90       where   month ( cast ( substring (FloatingID, 3 , 8 as   datetime )) = month ( @idate and   year ( cast ( substring (FloatingID, 3 , 8 as   datetime )) = year ( @idate )
 91      order   by   substring (FloatingID, 11 , 5 desc
 92 -- select @fid=MAX(substring(FloatingID,11,5)) from Populations  
 93    --  where  month(getdate())
 94                 set   @y = cast ( year ( @idate as   varchar ( 10 ))   --
 95                  set   @m = cast ( month ( @idate as   varchar ( 10 ))
 96                     if   len ( @m ) = 1
 97              set   @m = ' 0 ' + @m
 98          set   @d = cast ( day ( @idate as   varchar ( 10 ))
 99              if   len ( @d ) = 1
100                  set   @d = ' 0 ' + @d
101                   set   @ym = @y + @m + @d
102 if   @fid <> ''
103     -- 加一
104      begin
105
106          select   @str = convert ( nvarchar ,( convert ( int , right ( @fid , 5 )) + 1 ))
107                  while  ( 5 - len ( @str ) > 0 )
108          begin
109               set   @str = ' 0 ' + @str     
110          end
111                  set   @olde = @headStr + @ym + @str
112          -- select @olde
113      end
114 else
115     begin
116           set   @olde = @headStr + @ym + ' 00000 '
117           -- select @olde
118      -- print '2'
119     end  
120 set   @olde = convert ( nvarchar , @olde )
121 -- print 'UL'+convert(nvarchar,year(getdate()))+convert(nvarchar,month(getdate()))+@str
122 RETURN   @olde
123 end
124 GO
125 -- 测试
126 select  dbo.GetMonthFloatingID( ' 09 ' , getdate ())
127
128 -- -2009-03-04 涂聚文 geovindu@163.com

相关文章:

  • 免费的精品: Productivity Power Tools 动画演示
  • C++之solmyr小品文
  • CMake的应用(在vision studio2008中去掉 ALL_BUILD 和 ZERO_CHECK)
  • 使用sqlite保存数据返回主键
  • 码云 Gitee 新增仓库访问之 IP 白名单功能
  • CentOS 6.4 下安装vsftpd
  • python基础数据类型(1)
  • Oracle实现自增列
  • UIApplication
  • gearman简单介绍
  • 腾讯云10亿扶持小程序:3元套餐可能免费
  • java 7 入门书籍
  • 使用Docker 部署 LNMP+Redis 环境
  • [模板] 线段树合并
  • swift:打造你自己的折线图
  • python3.6+scrapy+mysql 爬虫实战
  • angular2开源库收集
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • PHP变量
  • SAP云平台里Global Account和Sub Account的关系
  • underscore源码剖析之整体架构
  • 深入 Nginx 之配置篇
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 算法-插入排序
  • 源码安装memcached和php memcache扩展
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 关于Android全面屏虚拟导航栏的适配总结
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2020)Java后端开发----(面试题和笔试题)
  • (编译到47%失败)to be deleted
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (原創) 未来三学期想要修的课 (日記)
  • (转)setTimeout 和 setInterval 的区别
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net 简单实现MD5
  • .net 使用ajax控件后如何调用前端脚本
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET使用存储过程实现对数据库的增删改查
  • .NET与 java通用的3DES加密解密方法
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • [Android]Tool-Systrace
  • [ANT] 项目中应用ANT
  • [BZOJ] 3262: 陌上花开
  • [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项
  • [Excel VBA]单元格区域引用方式的小结
  • [LeetCode] Minimum Path Sum
  • [Notice] 朋友们,blog更新http://jiang-hongfei.spaces.live.com
  • [python]基本输出输入函数
  • [springboot专栏]文件本地上传与提供访问服务
  • [StartingPoint][Tier1]Pennyworth
  • [笔记] 四边形不等式