日期:2014-05-17  浏览次数:20513 次

大家来看看我这个存储过程。。。


ALTER PROCEDURE [dbo].[usp_WhiteCardReplacements_GetEmailInfoToTable]
@CardNo nvarchar(50),
@LostDate nvarchar(20),
@City nvarchar(20),
@Provicne nvarchar(10),
@MailName nvarchar(30),
@MobilePhone nvarchar(30),
@Address nvarchar(100),
@ZipCode nvarchar(10),
@Email nvarchar(50),
@CardStatus int
AS
BEGIN
declare @CaseNo nvarchar(20)
declare @Date nvarchar(10)
declare @TableCount int
declare @ID int
declare @IsHandle bit=0
set @CaseNo='M'

select @Date=substring(convert(varchar(10),getdate(),112),3,10)

select @TableCount=count(*) from dbo.WhiteCardReplacementData
where datediff(dd,CreateDate,getdate())=0

set @CaseNo=@CaseNo+@Date+'#'+cast(@TableCount+1 as nvarchar)

print @CaseNo
if @CardStatus=5
begin
set @IsHandle=1
end
else
begin
set @IsHandle=0
end



END

表里面有个CaseNo变量,是通过自定义的方法生成的序号,生成方法在上面,算法就是日期+M+当天一共有多少条数据的计数+1,类似“20130506M1”这样的,我测试是没问题的,请问我这样写会不会存在什么隐患啊?
如果我要是生成类似“20130506M001”这样的,是不是我还要判断数据计数现在是2位数还是3位数啊?

------解决方案--------------------
你是从数字转换成nvarchar,不用判断几位数。
反正你现在是使用M作为分隔符,M之后就是数字了。
------解决方案--------------------
请问我这样写会不会存在什么隐患啊?
--> 
隐患1.以下这句可能存在性能问题,每次都需全表扫描一次. 
        select @TableCount=count(*) from dbo.WhiteCardReplacementData
        where datediff(dd,CreateDate,getdate())=0

隐患2.代码里的编码规则跟LZ所描述的不一致.

隐患3.存储过程高并发执行时,可能产生出相同的CaseNo.

如果我要是生成类似“20130506M001”这样的,是不是我还要判断数据计数现在是2位数还是3位数啊?
--> 可以这样写,自动补齐前导0的个数.
set @CaseNo=@CaseNo+@Date+'#'+replicate('0',3-len(@TableCount+1))+rtrim(@TableCount+1)

------解决方案--------------------
http://blog.csdn.net/dba_huangzj/article/details/7685162

高并发可以用IDENT_CURRENT来获取ID