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 ...
随机推荐
- 设置android状态栏颜色和toolbar颜色一致
使用:https://github.com/jgilfelt/SystemBarTint在Activity中:@Overrideprotected void onCreate(Bundle saved ...
- Truck History(poj 1789)
Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for v ...
- Struts2的声明式异常处理
在struts2应用程序中你还在使用try catch语句来捕获异常么?如果是这样的,那你OUT啦!struts2支持声明式异常处理,可以再Action中直接抛出异常而交给struts2来 处理,当然 ...
- c语言小练习(蛮好玩的)
1.求三个数的平均数,要求保留三位小数位 #include <conio.h> #include<stdio.h> int main(){ int a,b,c; float a ...
- Surprising Strings(map类)
http://poj.org/problem?id=3096 题意容易理解,开始直接暴力,还是用map写下吧,熟练一下: #include<stdio.h> #include<str ...
- phpMyAdmin 多个跨站脚本漏洞
漏洞名称: phpMyAdmin 多个跨站脚本漏洞 CNNVD编号: CNNVD-201307-649 发布时间: 2013-08-09 更新时间: 2013-08-09 危害等级: 中危 漏洞类 ...
- 调试中除了在URL上加时间戳外,如何避免js、css被返回304状态?
在本地开发环境(nginx)中,经常遇到这样的情况:调试js时浏览器总是不载入已修改的js内容,而直接吐出了上次缓存的代码. 我曾经做过以下尝试: ctrl+F5 ctrl+F5+F5+F5+F5 ...
- hdu 1175 连连看 DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 解题思路:从出发点开始DFS.出发点与终点中间只能通过0相连,或者直接相连,判断能否找出这样的路 ...
- python 解析xml 文件: SAX方式
环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...
- MAVEN 工程打包resources目录外的更多资源文件
首先,来看下MAVENx项目标准的目录结构: 一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,ma ...