本代码为通过特定关键字的字符串自动生成单据号;解决编程中频繁编写代码自动生成单据号。
- @SJ ---为格式字符串(以下是关键字含义)
- "%Y"表示完整年 如:2012
- "%y"表示简写年 如:12
- "%M"表示两位月份 如:01
- "%m"表示简写月份 如:1
- "%D"表示天 如:08
- "%d"表示简写天 如:8
- "%W" 或者 "%w"表示周(全年52周) 如:05(全年第五周)
- "%H"表示完整小时 如:08
- "%h"表示简写小时 如:8
- "%N"表示完整分钟 如:08
- "%n"表示简写分钟 如:8
- "%S"表示完整秒 如:08
- "%s"表示简写秒 如:8
- "%K"表示完整毫秒 如:008
- "%04X"表示生成单据号的流水号
- 04表示4为数字 如:流水号0005
- % X 表示通配符
- 其他非特定关键字可以任意组合
- @TableName ---为单据号的数据库表
- @ColName ----为数据表的单据号列
- @Remove -----为剔除自动生成单据号的数组 如:格式为"1,2,3,4,5,"
- @Mantissa ----为控制是否剔除包含还是匹配;"1"表示包含剔除的数据;"0"表示剔除完全匹配的单据号
- @Where ---为自动生成单据号的查询条件
- @ZD_date ---为单据号生成的单据日期
- @SSN ----为生产的单据号
例子:
格式字符串:投诉单%Y%M%06XAAAsdsA
自动生成的单据号:投诉单201206000001AAAsdsA

Create PROCEDURE [dbo].[ProcessAutoSN] (@SJ nvarchar(500), @TableName nvarchar(500), @ColName nvarchar(500), @Remove nvarchar(500), @Mantissa bit, @Where nvarchar(500), @ZD_date DATETIME , @SSN nvarchar(500) OUTPUT) AS BEGIN /* --自动生成单据号 --@SJ 流水号格式字符串 --@TableName 表名 --@ColName 列名 declare @SJ nvarchar(500), @TableName nvarchar(500), @ColName nvarchar(500), @SSN nvarchar(500) set @TableName='Table1' set @ColName='id'--投诉单1009001 set @SJ='投诉单%Y%M%04XAAAsdsA' */ declare @SN nvarchar(500), @Year nvarchar(4),@MinYear nvarchar(2), @Month nvarchar(2),@Day nvarchar(2),@Hour nvarchar(2),@Minute nvarchar(2),@week nvarchar(2), @second nvarchar(2),@Msecond nvarchar(2),@Sp nvarchar(500),@int int, @SL nvarchar(500),@Zero nvarchar(500),@ZZZ nvarchar(500),@Xzero INT IF (@ZD_date IS NULL) SET @ZD_date=GETDATE() set @SN=@SJ set @Year=year(convert(nvarchar(10),@ZD_date,120)) set @MinYear=right(year(convert(nvarchar(10),@ZD_date,120)),2) set @Month=month(convert(nvarchar(10),@ZD_date,120)) set @Day=Day(convert(nvarchar(10),@ZD_date,120)) SET @week=CEILING( DATEDIFF(d,CONVERT(NVARCHAR(4),YEAR(@ZD_date))+'-01-01',@ZD_date)/7.00) set @Hour=right('00'+convert(nvarchar(2),datepart(Hh,@ZD_date)),2) set @Minute=right('00'+convert(nvarchar(2),datepart(mi,@ZD_date)),2) set @second=right('00'+convert(nvarchar(2),datepart(ss,@ZD_date)),2) set @Msecond=right('00'+convert(nvarchar(4),datepart(ms,@ZD_date)),4) set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%Y',@Year) set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%y',@MinYear) set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%m' ,@Month) set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%M' ,right('00'+convert(nvarchar(2),@Month),2)) set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%D',right('00'+convert(nvarchar(2),@Day),2)) set @SN=replace(@SN ,'%d',@Day) set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%w',right('00'+convert(nvarchar(2),@week),2)) set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%W',right('00'+convert(nvarchar(2),@week),2)) set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%H',right('00'+convert(nvarchar(2),@Hour),2)) set @SN=replace(@SN,'%h',@Hour) set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%N',right('00'+convert(nvarchar(2),@Minute),2)) set @SN=replace(@SN,'%n',@Minute) set @SN=replace(@SN COLLATE Chinese_PRC_CS_AS,'%S',right('00'+convert(nvarchar(2),@second),2)) set @SN=replace(@SN,'%s',@second) set @SN=replace(@SN,'%K',right('000'+convert(nvarchar(2),@Msecond),3)) set @Zero=patindex('%[%]%X%',@SN) SET @Xzero=@Zero if (@Zero<=0) begin SET @SSN=@SN return end set @Sp=right(@SN,len(@SN)+1-charIndex('%',@SN)) set @SL=left(@Sp,charindex('X',@Sp)) set @ZZZ=@Sp if (charIndex('X',@Sp)<=0) begin SET @SSN=@SN return end set @Sp=left(@Sp,charIndex('X',@Sp)-1) set @Sp=replace(@Sp,'%','') if(isnumeric(@Sp)=0) begin SET @SSN='' return end IF Not EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].['+@TableName+']') AND type in (N'U')) BEGIN SET @SSN=@SN return end else begin IF Not EXISTS (select [name] from syscolumns where [name]=@ColName and OBJECTPROPERTY(id,'IsUserTable')=1 and object_name(id)=@TableName) begin SET @SSN=@SN return end end declare @SQL nvarchar(4000),@Max nvarchar(500),@Start int,@End int set @Zero=Replicate('0',@Sp) set @Start=charIndex('%',@SN)-1 set @End=charIndex('X',@SN) SET @End=@End+@Sp-(@End-@Start) --SELECT @Xzero --set @SN=replace(@SN,@SL,@Zero) set @SQL='left(right('+@ColName+',len('+@ColName+')-'+convert(nvarchar(50),@Start)+'),'+convert(nvarchar(50),@Sp)+')' set @SQL='select @Max=max(case when isnumeric('+@SQL+')=1 then '+@SQL+'else '''+@Zero+''' end ) from '+@TableName+' where len('+@ColName+')=len(replace('''+@SN+''','''+@SL+''','''+@Zero+'''))' set @SQL=@SQL+' and left('+@ColName+','+convert(nvarchar(50),@Start)+')=left(replace('''+@SN+''','''+@SL+''','''+@Zero+'''),'+convert(nvarchar(50),@Start)+')' set @SQL=@SQL+' and left('+@ColName+','+convert(nvarchar(50),@Xzero-1)+')+right('+@ColName+',len('+@ColName+')-'+convert(nvarchar(50),@Xzero-1+LEN(@Zero))+')=replace('''+@SN+''','''+@SL+''','''+''+''')' --set @SQL=@SQL+' and right('+@ColName+',len('+@ColName+')-'+convert(nvarchar(50),@Xzero-1)+')=right(replace('''+@SN+''','''+@SL+''','''+@Zero+'''),len(replace('''+@SN+''','''+@SL+''','''+@Zero+'''))-'+convert(nvarchar(50),@End)+')' IF (@Where<>'' AND @Where IS NOT NULL) SET @sql=@sql+' and '+@Where --SELECT @sql EXEC sp_executesql @sql, N'@Max nvarchar(500) OUTPUT', @Max OUTPUT if (@Max is null) set @Max=0 set @Start=convert(int,@Max)+1 if (@Remove is not null and ltrim(@Remove)<>'') begin if (@Mantissa is not null and @Mantissa=0) begin while(dbo.CheckArrInStr(' '+convert(nvarchar(50),@Start),@Remove,',')=1) begin set @Start=@Start+1 end end else begin while(dbo.CheckArrInStr(' '+right(convert(nvarchar(50),@Start),1),@Remove,',')=1) begin set @Start=@Start+1 end end end set @SN=replace(@SN,left(@SL,charindex('X',@SL)),right(@Zero+convert(nvarchar(500),@Start),len(@Zero))) SET @SSN=@SN END
检查完全匹配剔除数据

Create function [dbo].[CheckArrInStr](@s as varchar(500),@sArr as varchar(5000),@Split varchar(500)) returns int as begin declare @next int declare @ret int set @ret=0 set @next=1 while @next<=dbo.Get_StrArrayLength(@sArr,@Split) begin if (ltrim(dbo.Get_StrArrayStrOfIndex(@sArr,@Split,@next))<>'') begin if (charindex(dbo.Get_StrArrayStrOfIndex(@sArr,@Split,@next),@s)>0) begin set @ret=1; break; end end set @next=@next+1 end return @ret end
检查包含剔除数据

Create function [dbo].[CheckStrInArr](@s as varchar(50),@sArr as varchar(5000),@Split varchar(500)) returns int as begin declare @next int declare @ret int set @ret=0 set @next=1 while @next<=dbo.Get_StrArrayLength(@sArr,@Split) begin if dbo.Get_StrArrayStrOfIndex(@sArr,@Split,@next)=@s begin set @ret=1; break; end set @next=@next+1 end return @ret end
字符串分割长度

Create function [dbo].[Get_StrArrayLength] ( @str varchar(5000), --要分割的字符串 @split varchar(10) --分隔符号 ) returns int as begin declare @location int declare @start int declare @length int set @str=ltrim(rtrim(@str)) set @location=charindex(@split,@str) set @length=1 while @location<>0 begin set @start=@location+1 set @location=charindex(@split,@str,@start) set @length=@length+1 end return @length end
取分割数组数据

Create function [dbo].[Get_StrArrayStrOfIndex] ( @str varchar(5000), --要分割的字符串 @split varchar(10), --分隔符号 @index int --取第几个元素 ) returns varchar(5000) as begin declare @location int declare @start int declare @next int declare @seed int set @str=ltrim(rtrim(@str)) set @start=1 set @next=1 set @seed=len(@split) set @location=charindex(@split,@str) while @location<>0 and @index>@next begin set @start=@location+@seed set @location=charindex(@split,@str,@start) set @next=@next+1 end if @location =0 select @location =len(@str)+1 return substring(@str,@start,@location-@start) end