SQL Server主键自动生成_表and存储过程
主键表:
CREATE TABLE [dbo].[KEYCODE](
[KeyName] [varchar](12) NOT NULL,
[KeyTableName] [varchar](40) NULL,
[KeyFieldName] [varchar](30) NULL,
[StrLen] [int] NULL,
[CodeLen] [int] NULL,
[CodeMin] [float] NULL,
[CodeMax] [float] NULL,
[CodeType] [varchar](1) NULL,
[CurrentCode] [float] NULL,
[FirstLoop] [varchar](1) NULL,
[Prefix] [varchar](6) NULL,
[Suffix] [varchar](6) NULL,
[Remarks] [varchar](500) NULL,
CONSTRAINT [PK_KEYCODE] PRIMARY KEY CLUSTERED
(
[KeyName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
主键生成SQL:
Create Procedure [dbo].[SP_GetKeyCode]
@KeyName Varchar(20),
@KeyCode Varchar(30) Output,
@IsReturn Bit = 0
AS
Declare @zeroStr as Varchar(30),@MaxRunningCode as Varchar(30),
@KeyTableName as Varchar(40),@KeyFieldName as Varchar(40),
@CodeLen as Smallint,@CodeMin as Decimal(20,0),@CodeMax as Decimal(20,0),
@CodeType as Varchar(1),@CurrentCode as Decimal(20,0),@FirstLoop as varchar(1),
@Prefix as Varchar(6),@Suffix as Varchar(6),@preFixStr as Varchar(10),
@tmpstr as Varchar(30),@tempStr1 as Varchar(40),@sSQL as Varchar(400),
@CCode as Decimal(20,0), @RetStr as Varchar(20),@CurrentKeyCode as Varchar(30),
@I as smallint, @HeadStr as Varchar(20)
DECLARE @TableNameStartPos SmallInt set @zeroStr = '000000000000000000000000000000'
Set @MaxRunningCode= '999999999999999999999999999999'
set @KeyName = Upper(@KeyName)
--set @HeadStr = upper(@HeadStr)
if not exists(Select * from KeyCode where KeyName = @KeyName)
Begin
If @IsReturn = 1
Begin
Select @KeyName keyname, '' KeyCode
Set @KeyCode = ''
Return
End
RaisError('%s is an invalid KeyName!',16,1,@KeyName)
Select @KeyCode = ''
Return
end Select @KeyTableName = IsNull(KeyTableName,''),
@KeyFieldName = IsNull(KeyFieldName,''),
@CodeLen = IsNull(CodeLen,0),
@CodeMin = Cast(IsNull(CodeMin,0) as Decimal(20,0)),
@CodeMax = cast(IsNull(CodeMax,99) as Decimal(20,0)),
@CodeType = IsNull(CodeType,'1'),
@CurrentCode = Cast(IsNull(CurrentCode,0) as Decimal(20,0)),
@FirstLoop = IsNull(FirstLoop,'0'),
@Prefix = IsNull(Prefix,''),
@Suffix = IsNull(Suffix,'')
From KeyCode Where KeyName = @KeyName -- To exclude alias from KeyTableName (:DELIBASE:DELORD --> DELORD)
set @tableNameStartPos=Patindex('%BASE:%',@KeyTableName)
if @tableNameStartPos>0
set @KeyTableName=subString(@KeyTableName,@TableNameStartPos+5,len(@KeyTableName)-@TableNameStartPos-4) Set @HeadStr = @Prefix Set @preFixStr='' if @CodeType = '1'
Begin
if @FirstLoop = '1'
set @tmpstr = Cast((@CurrentCode + 1) as Varchar(20))
else
begin
set @tmpstr = Cast((@CurrentCode+1) as Varchar(20))
set @CCode = @CurrentCode + 1
Update KeyCode set CurrentCode =Cast(@CCode as Decimal(20,0)) where keyname = @KeyName
set @TempStr1= @HeadStr + SubString(@zerostr,1,@CodeLen - len(@tmpstr))+ @tmpstr
if @CCode > @CodeMax ---Find from beginning
begin
If @IsReturn = 1
Begin
Select 'Error' KeyName, 'All numbers are occupied!' KeyCode
Set @KeyCode = ''
Return
End
raisError('All numbers are occupied!',16,1)
Select @KeyCode = ''
return
end
end --- FirstLoop <>'1'
set @retstr = @TmpStr
end --- CodeType ='1'
if @CodeType = '2' --- YY + XXXXXX
Begin
set @prefixStr = SUbString(Cast(year(GetDate()) as Varchar(4)),3,2)
if @KeyTableName <> @prefixStr
begin
set @CurrentCode = @COdeMin -1
Update KeyCode set KeyTableName = @prefixStr,CurrentCode = @CurrentCode
where KeyName = @KeyName
end
set @retStr=Cast((@CurrentCode+1) as Varchar(10))
end
if @CodeType = '3' --YY + MM + XXXXXX
begin
Set @PrefixStr = Cast(Month(GetDate()) as Varchar(2))
if len(@PrefixStr)=1
Set @PrefixStr = '0' + @PrefixStr
set @prefixStr = SUbString(Cast(year(GetDate()) as Varchar(4)),3,2) + @PrefixStr
if @KeyTableName <> @prefixStr
begin
set @CurrentCode=@CodeMin - 1
Update KeyCode set KeyTableName = @prefixStr,CurrentCode = @CurrentCOde
where KeyName = @KeyName
end
set @retStr=Cast((@CurrentCode+1) as Varchar(10))
end
if @CodeType = '4' -- YY+MM+DD+xxxxx
Begin
Set @TmpStr = Cast(Month(GetDate()) as Varchar(2))
if len(@tmpStr)=1
Set @tmpStr = '0' + @tmpStr
Set @tempStr1 = Cast(day(GetDate()) as Varchar(2))
if len(@tempStr1)=1
Set @tempStr1 = '0' + @tempStr1
set @prefixStr = SUbString(Cast(year(GetDate()) as Varchar(4)),3,2) + @tmpStr+@tempStr1
if @KeyTableName <> @prefixStr
begin
set @CurrentCode = @CodeMin -1
Update KeyCode set KeyTableName = @prefixStr,CurrentCode = @CurrentCode
where KeyName = @KeyName
end
set @retStr=Cast((@CurrentCode+1) as Varchar(10))
end
if @CodeType = '5' -- YYYY+MM+xxxxx
begin
Set @PrefixStr = Cast(Month(GetDate()) as Varchar(2))
if len(@PrefixStr)=1
Set @PrefixStr = '0' + @PrefixStr
set @prefixStr = Cast(year(GetDate()) as Varchar(4)) + @PrefixStr
if @KeyTableName <> @prefixStr
begin
set @CurrentCode=@CodeMin - 1
Update KeyCode set KeyTableName = @prefixStr,CurrentCode = @CurrentCOde
where KeyName = @KeyName
end
set @retStr=Cast((@CurrentCode+1) as Varchar(10))
end If @CodeType = '7' -- DDxxxx Moorthy 19/10/00
Begin
Set @tmpStr = Cast(Day(GetDate()) As Varchar(2))
set @PrefixStr = @PRefixStr + replicate('0',2-len(@TmpStr)) + @TmpStr
if @KeyTableName <> @Prefixstr
begin
set @CCode = @CodeMin - 1
Update KeyCode set KeyTableName = @prefixStr,CurrentCode = @CodeMin - 1
where KeyName = @KeyName
end
set @retStr = Cast((@CurrentCode+1) as Varchar(10))
End if @CodeType = '8' -- xYMxxxx ---- running number reset monthly Begin
Set @tmpStr = Cast(Right(Year(GetDate()),1) As Varchar(2))
If Cast(Month(GetDate()) As Varchar(2)) = '10'
Set @TmpStr = @TmpStr + 'A'
Else If Cast(Month(GetDate()) As Varchar(2)) = '11'
Set @TmpStr = @TmpStr + 'B'
Else If Cast(Month(GetDate()) As Varchar(2)) = '12'
Set @TmpStr = @TmpStr + 'C'
Else
Set @TmpStr = @TmpStr + Cast(Month(GetDate()) As Varchar(2)) set @PrefixStr = @PRefixStr + replicate('0',2-len(@TmpStr)) + @TmpStr
if @KeyTableName <> @Prefixstr
begin
set @CCode = @CodeMin - 1
Update KeyCode set KeyTableName = @prefixStr,CurrentCode = @CodeMin - 1
where KeyName = @KeyName
end
set @retStr = Cast((@CCode+1) as Varchar(10))
End if cast(@retstr as Decimal(20,0)) = @CodeMax -- modify CurrentCode
Update KeyCode set CurrentCode = @CodeMin -1 where KeyName = @KeyName
else
Update KeyCode set CurrentCode =Cast(@retstr as Decimal(20,0)) where keyname = @KeyName
Set @retstr = @HeadStr+ @PrefixStr + SubString(@zeroStr,1,@CodeLen-len(@retstr))+ @retstr+ @Suffix
Select @KeyCode = @RetStr If @IsReturn = 1
Begin
Select @KeyName KeyName, @KeyCode KeyCode
Set @KeyCode = ''
Return
End
SQL Server主键自动生成_表and存储过程的更多相关文章
- Oracle主键自动生成_表and存储过程
-- Create table create table T_EB_SYS_DN_SEQUENCE_CONFIG ( sequence_id VARCHAR2(36) default sys_guid ...
- MySql主键自动生成,表、实体、C#调用方法
1.表:mysql建表语句 DROP TABLE IF EXISTS `keycode`; CREATE TABLE `keycode` ( `Id` ) NOT NULL AUTO_INCREMEN ...
- hibernate主键自动生成
Entity类中,主键尽量使用可以为null值的类型,比如Integer,Long,String等,不要用int,long等.因为如果主键为null,则表示该实体类还没有保存到数据库,是一个临时状态( ...
- Sql Server 主键 外键约束
主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为 ...
- SQL Server 主键及自增长列的修改
一.对主键的修改 主键值都会带有主键约束,当执行update操作或是其他操作的时候就会受到限制无法修改,解决的方法是:取消主键约束->删掉主键列->插入修改后的主键值. (1)取消主键约束 ...
- Mybatis「MySQL-Oracle」 中主键自动生成 <selectKey> 序列化
有时候我们不仅仅是通过返回 int 影响行数来确定数据是否插入成功就行了,因为我们总是会用到这个刚刚插入的自增主键,比如主子表入库,子表需要主表的 id,那这个时候我们再去数据库查就显得有点 low ...
- Sql Server 主键由字母数字组成并按照数字自动增长
在SQL SERVER 中如果我们想要使主键按照一定规则自动增长我们可以这样做: 这里我们新建一张研究表,里面有研究ID,研究人员姓名和研究医院. 我们使SicentificId 设为主键 并且从1开 ...
- 数据库开发基础-SQl Server 主键、外键、子查询(嵌套查询)
主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个 ...
- Entity Framework Code First 遭遇主键自动生成问题
4.0后就没有去跟踪后面的版本了.现在直接开始用5.0没想到在做User的GURD时就遭遇insert不进数据问题. ISet<User>.Add(user);_context.SaveC ...
随机推荐
- 谈谈react-router学习
源网页 http://qiutc.me/post/%E8%B0%88%E8%B0%88-react-router.html React + webpack 爽的飞起,少了点什么. 多页面,每次请求页面 ...
- IHS怎么通过80端口连接WAS——<转>
IHS如何通过80端口连接WAS? 经常看到有朋友问这个问题,所以简单总结一下基本步骤: IHS和WAS之间是通过Plugin来实现的,一般的Plugins和IHS安装在同一物理机器上,WAS安装 ...
- 使用CSS为图片添加边框的几种方法
css的应用十分广泛,即便用在图片的效果中也是方法多样,本文下面就介绍五种为图片添加特殊效果边框的CSS写法阴影效果 通过使用带有一些padding之的背景图来添加阴影效果. HTML <img ...
- 【HDOJ】2822 Dogs
bfs. /* 2822 */ #include <iostream> #include <cstdio> #include <cstring> #include ...
- 【HDOJ】2222 Keywords Search
AC自动机基础题. #include <iostream> #include <cstdio> #include <cstring> #include <cs ...
- 【HDOJ】1247 Hat’s Words
字典树. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 50005 #d ...
- COJ 0288 路径(2015升级版)
路径(2015升级版) 难度级别:D: 运行时间限制:1000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 WZJ在生日当天决定在他的领地举行一场马拉松比赛,他的 ...
- Linux企业级开发技术(2)——epoll企业级开发之epoll接口
epoll的接口非常简单,总共只有三个函数: 1.int epoll_create(intsize); 生成一个 Epoll 专用的文件描述符,size用来告诉内核这个监听的数目一共有多大.这个参数不 ...
- 分治(CDQ):[BOI2007]摩基亚Mokia
[题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能 ...
- 重新注册IE组件
重新注册IE组件:1.打开一个记事本文件. 2.将下面的命令复制到记事本文件中.regsvr32 comcat.dll /sregsvr32 CSSEQCHK.DLL /sregsvr32 shdoc ...