主键表:

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存储过程的更多相关文章

  1. Oracle主键自动生成_表and存储过程

    -- Create table create table T_EB_SYS_DN_SEQUENCE_CONFIG ( sequence_id VARCHAR2(36) default sys_guid ...

  2. MySql主键自动生成,表、实体、C#调用方法

    1.表:mysql建表语句 DROP TABLE IF EXISTS `keycode`; CREATE TABLE `keycode` ( `Id` ) NOT NULL AUTO_INCREMEN ...

  3. hibernate主键自动生成

    Entity类中,主键尽量使用可以为null值的类型,比如Integer,Long,String等,不要用int,long等.因为如果主键为null,则表示该实体类还没有保存到数据库,是一个临时状态( ...

  4. Sql Server 主键 外键约束

    主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为 ...

  5. SQL Server 主键及自增长列的修改

    一.对主键的修改 主键值都会带有主键约束,当执行update操作或是其他操作的时候就会受到限制无法修改,解决的方法是:取消主键约束->删掉主键列->插入修改后的主键值. (1)取消主键约束 ...

  6. Mybatis「MySQL-Oracle」 中主键自动生成 <selectKey> 序列化

    有时候我们不仅仅是通过返回 int 影响行数来确定数据是否插入成功就行了,因为我们总是会用到这个刚刚插入的自增主键,比如主子表入库,子表需要主表的 id,那这个时候我们再去数据库查就显得有点 low ...

  7. Sql Server 主键由字母数字组成并按照数字自动增长

    在SQL SERVER 中如果我们想要使主键按照一定规则自动增长我们可以这样做: 这里我们新建一张研究表,里面有研究ID,研究人员姓名和研究医院. 我们使SicentificId 设为主键 并且从1开 ...

  8. 数据库开发基础-SQl Server 主键、外键、子查询(嵌套查询)

    主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个 ...

  9. Entity Framework Code First 遭遇主键自动生成问题

    4.0后就没有去跟踪后面的版本了.现在直接开始用5.0没想到在做User的GURD时就遭遇insert不进数据问题. ISet<User>.Add(user);_context.SaveC ...

随机推荐

  1. [BZOJ 1033] [ZJOI2008] 杀蚂蚁antbuster 【模拟!】

    题目链接: BZOJ - 1033 题目分析 模拟!纯粹按照题目描述模拟! 这是一道喜闻乐见的经典模拟题! 我一共写了2遍,Debug 历时2天的所有晚自习 ... 时间超过 8h ... 我真是太弱 ...

  2. Nine Great Books about Information Visualization

    Nine Great Books about Information Visualization Maybe it’s anachronistic to celebrate static, print ...

  3. unix io 模型浅析

    POSIX中对同步IO和异步IO的规定: 同步IO操作:引起进程的阻塞直到IO操作完成,异步IO操作:IO操作不会引起进程阻塞 在UNIX下,有5中操作模型: 阻塞IO,非阻塞IO,IO复用,信号驱动 ...

  4. 初始化rails上的compass项目

    compass以外还有一个很实用的scss模块, _media-queries.scss 通过终端下载 curl -O https://raw.github.com/paranoida/sass-me ...

  5. Java中final、finally和finalize的区别(转)

    http://www.cnblogs.com/bluestorm/archive/2012/04/22/2464746.html final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖, ...

  6. C# DataGridView 导出 Excel(根据Excel版本显示选择不同后缀格式xls或xlsx)

    /// <summary> /// DataGridView导出至Excel,解决问题:打开Excel文件格式与扩展名指定格式不一致 /// </summary> /// &l ...

  7. 《how to design programs》15章 相互引用的数据定义

    由结构体组成的表与结构体中的表. 在用追溯形式建立家家谱树时,我们通常从某个后代除法,依次处理它的父母,组父母等.而构建树时,我们会不断添加谁是谁的孩子,而不是写出谁是谁的父母,从而建立一颗后代家谱树 ...

  8. (转载)PHP_Memcache函数详解

    (转载)http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/04/19/2021605.html memcache函数所有的方法列表如下: M ...

  9. 字符串(后缀自动机):USACO Dec10 恐吓信

    [题目描述] FJ刚刚和邻居发生了一场可怕的争吵,他咽不下这口气,决定佚名发给他的邻居一封脏话连篇的信.他有无限张完全相同的已经打印好的信件,都包含 N个字母(1<=N<=50,000). ...

  10. android导入项目出错处理

    问题: 执行Import-Android下的Existing Android Code Into Workspace 解决方法: