博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL Server主键自动生成_表and存储过程
阅读量:4690 次
发布时间:2019-06-09

本文共 6632 字,大约阅读时间需要 22 分钟。

主键表:

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 = 0ASDeclare	@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	SmallIntset @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 = ''	ReturnendSelect	@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 = @PrefixSet @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 = @TmpStrend  --- CodeType ='1'if @CodeType = '2' --- YY + XXXXXXBegin  	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))endif @CodeType = '3' --YY + MM + XXXXXXbegin	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))endif @CodeType = '4'   --	YY+MM+DD+xxxxxBegin	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))endif @CodeType = '5'  -- YYYY+MM+xxxxxbegin	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))endIf @CodeType = '7'   -- DDxxxx  Moorthy 19/10/00Begin	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))Endif @CodeType = '8'    -- xYMxxxx ----  running number reset monthlyBegin	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))Endif cast(@retstr as Decimal(20,0)) = @CodeMax  -- modify CurrentCode	Update KeyCode set CurrentCode = @CodeMin -1 where KeyName = @KeyNameelse	Update KeyCode set CurrentCode =Cast(@retstr as Decimal(20,0)) where keyname = @KeyNameSet @retstr = @HeadStr+	@PrefixStr + SubString(@zeroStr,1,@CodeLen-len(@retstr))+ @retstr+ @SuffixSelect @KeyCode = @RetStrIf @IsReturn = 1 Begin	Select @KeyName KeyName, @KeyCode KeyCode	Set @KeyCode = ''	ReturnEnd

 

转载于:https://www.cnblogs.com/xytmj/p/4280047.html

你可能感兴趣的文章
VS2005编译VTK5.10.1
查看>>
shp系列(一)——利用C++进行shp文件的读(打开)与写(创建)开言
查看>>
总结上海永辉云商高级前端职位面试题集
查看>>
匹配两个空格之间的字符。。。
查看>>
CSS 文字溢出 变成省略号 ...
查看>>
Spring事务
查看>>
java编程基础(三)流程控制语句
查看>>
让数据库跑的更快的7个MySQL优化建议
查看>>
jquery 取id模糊查询
查看>>
解决在vue中,自用mask模态框出来后,下层的元素依旧可以滑动的问题
查看>>
修改node节点名称
查看>>
Java 文件下载
查看>>
图论——读书笔记 (深度优先搜索)
查看>>
PAT(B) 1014 福尔摩斯的约会(Java)
查看>>
PAT甲级题解-1123. Is It a Complete AVL Tree (30)-AVL树+满二叉树
查看>>
项目开发总结报告(GB8567——88)
查看>>
SSH加固
查看>>
端口扫描base
查看>>
iOS IM开发的一些开源、框架和教程等资料
查看>>
FansUnion:共同写博客计划终究还是“流产”了
查看>>