两个数字字符串相加生成新的字符串
2006-07-29 16:33
344 查看
/*
--在函数里不能用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
--在函数里不能用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
相关文章推荐
- 面试题--两个字符串数字相加,不能用jdk自带的类型转换方法
- leetcode_415(两个数字字符串相加,模拟大数相加)
- 415. Add Strings (计算由两个字符串表示的数字相加之和)
- 面试题七 C/C++ 两个字符串由数字组成的相加,最大不超过32bit整形的系统函数--程序员面试题
- LeetCode425——Add Strings(两个字符串中的数字相加(十进制或二进制),输出字符串形式的结果)
- java两个字符串数字相加
- JAVA 两个大字符串数字相加
- 415. Add Strings--两个用字符串表示的数字相加
- 杭电 1002 大数相加 【关键语句:sum=a[i]-'0'+b[j]-'0'+carry;c[i]='0'+sum%10;//-‘0’字符串转换成数字-‘0’,数字转换成字符串+‘0’】
- 两个单链表生成相加链表
- js中,实现两个数字相加
- java机试-用字符串模拟两个大数相加
- 泛型:两个数字相加
- javascript自动生成包含数字与字符的随机字符串
- 两个大数相加,使用字符串模拟相加过程
- 二者都是将 byte[] 转换成字符串,一个区别在于 Convert.ToBase64String 使用 base 64 数字编码,所以它生成的全部是 ASCII 字符。
- 字符串中的等号后的第一个数字相加
- JAVA生成8位随机字符串,数字+英文字母
- 【C++】两个字符串相加
- Interview Q&A - 两个字符串整数相加返回和的字符串(C#)