USE [testmall]
GO
/****** 对象: StoredProcedure [dbo].[getNumber] 脚本日期: 12/12/2008 11:40:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GOALTER proc [dbo].[getNumber]
@tablename varchar(100),
@id varchar(100),
@column varchar(100),
@value varchar(13) output
as
declare @number varchar(50) --存储最大id对应的编号
declare @sql Nvarchar(2000) --存储动态sql语句
declare @time varchar(8) --存储时间,格式如20080908
declare @timeLeft varchar(8) --存储编号前面8位字符,表示时间
declare @total int --存储当天的编号总数
declare @totalStr varchar(8) --存储当天的编号总数,最多5个字符不足前面补0set @sql=N'SELECT @number='+@column+' from '+@tablename+' where '+@id+' in(select max('+@id+') from '+ @tablename+')'
exec sp_executesql @sql,N'@number varchar(50) output' ,@number output
set @time=CONVERT(varchar(12) , getdate(), 112 )---获取时间字符
if(@number=null or ltrim(rtrim(@number))='')
set @value=right(@time,6)+'000001'---表示第一条记录
else
begin
set @number=substring(@number,charindex('0',@number),12)--获取0后面的12位数字 即格式为080925000001
set @timeLeft=left(@number,6)
if(@timeLeft=right(@time,6))--表示同一天,编号递增
begin
set @total=cast(Ltrim(substring(@number,7,6)) as int)
set @total=@total+1
set @totalStr=right(1000000+@total,6)
set @value=@timeLeft+@totalStr
end
------------------------------------------end if-----------------
else--表示不是同一天,编号从000001开始
begin
set @value=right(@time,6)+'000001'
end
end
这是我在项目中用到的编号,请问有什么不好的地方吗,会不会有并发问题
GO
/****** 对象: StoredProcedure [dbo].[getNumber] 脚本日期: 12/12/2008 11:40:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GOALTER proc [dbo].[getNumber]
@tablename varchar(100),
@id varchar(100),
@column varchar(100),
@value varchar(13) output
as
declare @number varchar(50) --存储最大id对应的编号
declare @sql Nvarchar(2000) --存储动态sql语句
declare @time varchar(8) --存储时间,格式如20080908
declare @timeLeft varchar(8) --存储编号前面8位字符,表示时间
declare @total int --存储当天的编号总数
declare @totalStr varchar(8) --存储当天的编号总数,最多5个字符不足前面补0set @sql=N'SELECT @number='+@column+' from '+@tablename+' where '+@id+' in(select max('+@id+') from '+ @tablename+')'
exec sp_executesql @sql,N'@number varchar(50) output' ,@number output
set @time=CONVERT(varchar(12) , getdate(), 112 )---获取时间字符
if(@number=null or ltrim(rtrim(@number))='')
set @value=right(@time,6)+'000001'---表示第一条记录
else
begin
set @number=substring(@number,charindex('0',@number),12)--获取0后面的12位数字 即格式为080925000001
set @timeLeft=left(@number,6)
if(@timeLeft=right(@time,6))--表示同一天,编号递增
begin
set @total=cast(Ltrim(substring(@number,7,6)) as int)
set @total=@total+1
set @totalStr=right(1000000+@total,6)
set @value=@timeLeft+@totalStr
end
------------------------------------------end if-----------------
else--表示不是同一天,编号从000001开始
begin
set @value=right(@time,6)+'000001'
end
end
这是我在项目中用到的编号,请问有什么不好的地方吗,会不会有并发问题
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货