/*
--在函数里不能用getdate()类似这样系统函数
--将数字字符进行相加生成新的数字字符串数据,并加上自己相应的前缀,可以用来生成ID号,生成的数字字符串不会越过整形的长度范围
select dbo.CreateDifferentID('MM','0000','45','varchar') ---生成MM0045
*//*
创建人:Hopewell_Go
引用保留此*/
CREATE FUNCTION CreateDifferentID(@vPreString varchar(50),@vStartString varchar(250),@vSetID varchar(200),@vEditType varchar(20))
RETURNS varchar(250)
AS
BEGIN
declare @vReturnValue varchar(250)
,@vRemnantString varchar(250)
,@iPreChar int
,@iSetChar int
,@iAddChar int
,@iPreLen int
,@iSetLen int
,@iPrePos int
,@iSetPos int
,@iFeedInBit int
,@iEndLen int
,@vTemp varchar(20)
select @vReturnValue=''
,@vRemnantString=''
,@iPreLen=len(ltrim(rtrim(@vStartString)))
,@iPreChar=null
,@iPrePos=1
,@iAddChar=0
,@iSetLen=len(ltrim(rtrim(@vSetID)))
,@iSetPos=1
,@iFeedInBit=0
,@iEndLen=0
,@vTemp=''
--实现字符串的ID,如0000000
if(@vEditType='varchar')
begin
if(@iPreLen<@iSetLen) --进行数据交换,也就是长字符串在前,短字符串在后。
begin
select @vTemp=@vStartString
,@vStartString=@vSetID
,@vSetID=@vTemp
,@vTemp=@iPreLen
,@iPreLen=@iSetLen
,@iSetLen=@vTemp
end
while(@iPrePos<=@iPreLen)
begin
set @iPreChar=substring(@vStartString,@iPreLen-@iPrePos+1,1)
if(@iSetPos<=@iSetLen)
begin
select @iSetChar=substring(@vSetID,@iSetLen-@iPrePos+1,1)+@iFeedInBit
,@iAddChar=@iPreChar+@iSetChar
,@iFeedInBit=@iAddChar/10
,@vReturnValue=cast(@iAddChar%10 as varchar)+@vReturnValue
set @iEndLen=@iPrePos
end
else
begin
if(@iFeedInBit=1) --有进位时就要加入进位
begin
select @iAddChar=@iPreChar+@iFeedInBit
,@iFeedInBit=@iAddChar/10
,@vReturnValue=cast(@iAddChar%10 as varchar)+@vReturnValue
if(@iFeedInBit=0)
begin
set @iEndLen=@iPrePos
break
end
else if(@iPrePos=@iPreLen) --处理最后一位进位
begin
select @vReturnValue='1'+@vReturnValue
,@iEndLen=@iPreLen
break
end
end
else --没有进位就结束
begin
break
end
end
select @iPrePos=@iPrePos+1
,@iSetPos=@iSetPos+1
end
select @vRemnantString=left(@vStartString,@iPreLen-@iEndLen)
,@vReturnValue=@vPreString+@vRemnantString+@vReturnValue
end
--return(@iFeedInBit)
/*
else if(@vEditType='year')
begin
select @vReturnValue=dbo.CreateDifferentID(@vPreString,@vStartString ,@vSetID,'varchar')
,@vReturnValue=replace(@vReturnValue,@vPreString,@vPreString+'05')
end
*/
return (@vReturnValue)
END