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 ...
随机推荐
- 单片机IO处理 电容触摸按键
原理说明: 通过检测感应按键PAD的电容量变化来判断是否有触摸动作.当手指触摸PAD时,电容量增加,充放电时间变长. 本方案中利用M48的20个双向IO口实现了20个触摸按键,而且所用原器件最少.其中 ...
- xp下删除windows7,无法删除windows7文件夹,无法删除windows7文件,双系统卸载,取得文件权限
http://blog.csdn.net/lanmanck/article/details/5722050 ---------------------------------------------- ...
- c# 绘图常用对象和方法
//BitMap 位图,常用的方法, Save:主要方式有:(1)保存在图像文件里,可以指定格式[gif,bmp]:(2) 保存在流中,以指定格式[gif,bmp] //gra ...
- 【算法Everyday】第二日 求子数组的最大和
题目 // 3.求子数组的最大和 // 题目: // 输入一个整形数组,数组里有正数也有负数. // 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. // 求所有子数组的和的最大值. ...
- 【转】 java中HashMap详解
原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...
- 【转】Ansys 13.0 flexlm not running完美解决方案
http://jingyan.baidu.com/article/af9f5a2dd9843a43150a4550.html 实测,12.1 用此方法问题同样得解.
- ink_test
- NeoOcean - Unity3D Ocean Waves Simulation
GMail: bearworks8@gmail.com QQMail:196221347@qq.com QQ Group:391782326 Dropbox Demo: https://www.dr ...
- 在Ubuntu中安装Redis
原文地址:http://blog.fens.me/linux-redis-install/ 在Ubuntu中安装Redis R利剑NoSQL系列文章,主要介绍通过R语言连接使用nosql数据库.涉及的 ...
- Reward(拓扑排序)
http://acm.hdu.edu.cn/showproblem.php?pid=2647 题意: 老板要给n个员工发工资最低工资是888: 但是工人们是有要求的 如果输入 a b 表示a的工资要比 ...