热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

主键生成器_sqlserver

这些天忙着做毕业设计,忙着敲代码,早发现像原来那样“无聊”的把那些技术文字再敲一遍是没有多大意义的,因为写出它们所用的时间要是仔细在看或者再用代码做几个实际的例子应该更好吧,其实这是早知道的,那以前

这些天忙着做毕业设计,忙着敲代码,早发现像原来那样“无聊”的把那些技术文字再敲一遍是没有多大意义的,因为写出它们所用的时间要是仔细在看或者再用代码做几个实际的例子应该更好吧,其实这是早知道的,那以前知道还那么干,主要是因为太想做老师了吧!现在呢,不那么干不写了是因为暂时放弃做老师的打算吧,这两天空闲的时候复习数据库,翻到了以前的所写的一个存储过程“主键生成器”,sqlserver版本的是在以前项目中用过的,oracle版本的是后面学习Oracle时补上的,不管怎么样,有看了一遍,敲了一遍,将来面视的时候也许用得着吧。

SQLServer版

USE TEST

http://www.gaodaima.com/34906.html主键生成器_sqlserver

IF EXISTS (SELECT name FROM sysobjects    –检查系统中是否 有与自定义存储过程同名的对象

         WHERE name = ‘getNo’ AND type = ‘P’)

   DROP PROCEDURE getNo

GO

  CREATE PROCEDURE getNo 

                  @precRecord varchar(10),    –3个参数。第1个 为输入参数(表名);第3个 为输入

          –参数(用以判断输出格式);; 第2个 为输出参数 (最后生成的主键编号)

                  @primarykey varchar(12) output ,           –若第3个参数等于0时,主键= 字轨+时期+编号 

                          — 若第3个参数等于1时,主键=字轨+编号

                  @sign  smallint                                  —         若第3个参数等于其他时 报错

AS

    declare @prctmpdate datetime,                        –临时变量,用以记录存储过程中的中间变量

        @today datetime,

        @tmpprenum   varchar(4),

        @tmpword   varchar(2),

        @year1  varchar(2),

        @day1   varchar(2),

        @month1 varchar(2) ————————————————————————————————————

set @today = getdate()

if not exists(select fRecord from tbrecno where [email protected])   –若表中没有与参数1同名的则新插入一条

   begin

  insert into tbrecno  (fRecord,Predate,Prenum,Word) values(@precRecord,@today,1,left(@precRecord,2))

   end

else

   begin

       select @prctmpdate=Predate from tbrecno where [email protected]

       if ( datediff (day, @today , @prctmpdate ) <0 )   –比较    若当前日期<上次日期  ,令  

                   –上次日期=上次日期 且 上次编号置为零

           begin

             update tbrecno  set Prenum = ‘1’ ,predate = @today where [email protected]

           end 

       else if (datediff(day,  @today , @prctmpdate ) = 0 )  –若当前日期=上次日期  ,令上次编号加一

           begin

             update tbrecno set Prenum = Prenum + 1 where [email protected]     

           end

       else if ( datediff (day, @today , @prctmpdate ) > 0 )               –若当前日期〈上次日期  ,报错

           begin

             raiserror (‘the db server date erreor  check system date please!’, 16, 1)

           end

  end

—————————————————————————————————————

 

  select  @prctmpdate=Predate,@tmpword=Word, @tmpprenum=prenum from tbrecno where [email protected]

  select @tmpprenum=                                                                –上次编号不够四位的补够四位

              case len(ltrim(rtrim(@tmpprenum)))

               when 1 then ‘000’+rtrim(ltrim(@tmpprenum))

                when 2 then ’00’+ rtrim(ltrim(@tmpprenum))

                when 3 then ‘0’+  rtrim(ltrim(@tmpprenum))

                when 4 then       rtrim(ltrim(@tmpprenum))

              end

—————————————————————————————————————–

set @year1 =right(ltrim(rtrim((str(year(@prctmpdate ))))),2)                      –取出年份

select @month1=

               case len (ltrim(str(month(@prctmpdate))))                   –取出月份,若不够两位的补够两位

                 when 1 then ‘0’+ltrim(str(month(@prctmpdate )))

                 when 2 then     ltrim(str(month(@prctmpdate )))

               end

select @day1=                                                                        –取出天数,若不够两位的补够两位

               case len (ltrim(str(day(@prctmpdate))))

                 when 1 then ‘0’+ltrim(str(day(@prctmpdate )))

                 when 2 then  ltrim(str(day(@prctmpdate )))

               end

—————————————————————————————————————-

 if @sign=1

    begin                                                                             –判断输出类型

       set  @primarykey =rtrim(ltrim(@tmpword))+ @tmpprenum

    end

 else if   @sign=0

    begin

        set @primarykey = @tmpword+ @year1 + @month1 + @day1 + @tmpprenum

    end

 else

    begin

      raiserror (‘parameter error’, 16, 1)  

    end

————————————————————————–

GO

——————————————————————-

—                                    测试

declare @mybillno varchar(12) 

 exec getNo ‘pG’, @mybillno output,0

  select @mybillno

—  IF EXISTS (select * from Tbrecno where word = left(ltrim(rtrim( @precRecord )),2))

      —    raiserror (‘表名的前两个字母与已有的发生冲突 请修改表名’, 16, 1)

— delete tbrecno


–select * from tbrecno
Oracle版

create or replace procedure getmykeyno(
sign varchar2,
tablename varchar2,
outkey out varchar2
)
is

— sign getmykey.my_ziguei %type; 
— tablename getmykey.my_tablename %type; 
–outkey varchar(20);

lastdate getmykey.my_lastdate%type;
tmpint getmykey.my_lastno %type;
nowdate date;
tmpStr varchar(4);
tmpsign varchar(2);

myyear int;
mymonth int;
myday int;

tmpcount int;

begin
myyear := extract(year from sysdate);
mymonth := extract(month from sysdate);
myday := extract(day from sysdate);

nowdate:=sysdate;
–tablename:=’aaaa’;
–sign:=’ad’;

select count(*) into tmpcount from getmykey where my_tablename = tablename;
if tmpcount=0 then

   begin
      insert into getmyke(my_tablename,my_ziguei,my_lastno,my_lastdate) values          (tablename,sign,1,nowdate) ;tmpInt := 1;
end;
else 
select my_lastdate into lastdate from getmykey where my_tablename=tablename ;

if (myyear>=extract(year from lastdate) and mymonth>=extract(month from lastdate)) then

if(myday=extract(day from lastdate)) then

update getmykey set my_lastno = my_lastno + 1 where my_tablename=tablename; 
select my_lastno into tmpint from getmykey where my_tablename=tablename;

else 
if (myday > extract(day from lastdate)) then

update getmykey set my_lastno = 1 where my_tablename=tablename ;
update getmykey set my_lastdate = nowdate where my_tablename=tablename;
tmpInt := 1 ;
else 
dbms_output.put_line(‘服务器的时间改变,请检查系统!’);
end if; 

end if; 
end if; 

end if;
tmpStr:=lpad(to_char(tmpint),4,’0′);

— dbms_output.put_line(tmpstr);

outkey := substr(to_char(myyear),3,2) || lpad(to_char(mymonth),2,’0′) || lpad(to_char(myday),2,’0′) || tmpStr;
select my_ziguei into tmpsign from getmykey where my_tablename=tablename;

outkey:=tmpsign ||outkey;
–dbms_output.put_line(outkey);

end;

 

欢迎大家阅读《主键生成器_sqlserver》,跪求各位点评,若觉得好的话请收藏本文,by



推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • MySQL多表数据库操作方法及子查询详解
    本文详细介绍了MySQL数据库的多表操作方法,包括增删改和单表查询,同时还解释了子查询的概念和用法。文章通过示例和步骤说明了如何进行数据的插入、删除和更新操作,以及如何执行单表查询和使用聚合函数进行统计。对于需要对MySQL数据库进行操作的读者来说,本文是一个非常实用的参考资料。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • PLSQL块:PLSQL块都用于解决特定问题,PLSQL块可以有参数,也可以相互调用。PLSQL块可以作为模式对象在Oracle数据库中保存,根据用途可以 ... [详细]
  • ***Createdbyjiachenpanon161118.**合法uri*exportfunctionvalidateURL(textval){consturlregex^( ... [详细]
  • 6.1WMLScript规则这些标准函数库提供一个扩展WMLScript语言的机制,这些 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 本文讨论了编写可保护的代码的重要性,包括提高代码的可读性、可调试性和直观性。同时介绍了优化代码的方法,如代码格式化、解释函数和提炼函数等。还提到了一些常见的坏代码味道,如不规范的命名、重复代码、过长的函数和参数列表等。最后,介绍了如何处理数据泥团和进行函数重构,以提高代码质量和可维护性。 ... [详细]
author-avatar
hja2045905
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有