新人提个初级问题,插入数据是怎么实现一个列varchar类型自动加1

weixin_41025033 2017-11-11 02:33:52
declare @SHEET_NO varchar(18)

set @SHEET_NO ='XD0000021711100003';

INSERT INTO t_rm_vip_stored
(SHEET_NO,BRANCH_NO,CUST_NO,CUST_NAME,TEL_NO,SERVER_NO,SERVER_NAME,TOT_NUM,TOT_MONEY,REAL_MONEY,FAV_MONEY,RET_NUM,OPER_OPER,OPER_DATE,SERVER_TYPECODE,MEMO,VOLID_DATE,STORED_FLAG,PAY_WAY,CARD_NO,VIP_ID,MONTH_COUNT)
select
@SHEET_NO+1,'000001',mobile,vip_name,mobile, '1','10送','11','100.00','100.00','0.00', save_amt,'1001','2017-11-10 21:17:29.827','02','','2017-11-10 21:15:30.863','0','RMB','', mobile,NULL
from t_rm_vip_info where card_type='01' and save_amt>'0'
我想插入的时候@SHEET_NO自动加1
...全文
642 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wtujedp 2017-11-13
  • 打赏
  • 举报
回复
--创建编号规则表 CREATE TABLE [dbo].[IDInfo]( [IDName] [varchar](20) NOT NULL, [MaxID] [int] NOT NULL, [IDDate] [datetime] NULL, [IDType] [char](1) NOT NULL, [IDLen] [int] NOT NULL, [IDValue] [varchar](16) NULL, PRIMARY KEY CLUSTERED ( [IDName] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] --存储过程,生成自增编号 CREATE proc [dbo].[P_YFY_GETID] (@idname varchar(20),@idtype char(1),@idlen int) as declare @vRet varchar(16)=''; begin SET NOCOUNT ON ; begin tran declare @error int=0; begin try if @idname is not null and @idname!='' begin declare @maxid int=1; declare @IDDateOld datetime=null; declare @IDTypeOld char(1)=''; declare @IDlenOld int=0; --获取年月日字符 declare @year char(4)=cast(year(getdate()) as varchar(4)); declare @month char(2)= right('0'+cast(month(getdate()) as varchar(2)),2); declare @day char(2)=right('0'+cast(day(getdate()) as varchar(2)),2); --编码的长度控制在4-8位 if @idlen<4 or @idlen >8 set @idlen=4; select @maxid=MaxID,@IDDateOld=IDDate,@IDTypeOld=IDType,@IDlenOld=IDLen from IDInfo WITH (UPDLOCK,ROWLOCK) where IDName=@idname; --原先已经有记录的,则使用原来的参数 if @IDTypeOld!='' set @idtype=@IDTypeOld if @IDlenOld !=0 set @idlen=@IDlenOld declare @id varchar(8)=''; if upper(@idtype)='Y' begin if YEAR(GETDATE())!=YEAR(@IDDateOld) begin set @maxid=1 end set @vRet=@year+right('00000000'+cast(@maxid as varchar(8)),@idlen); set @maxid=@maxid+1; end else if upper(@idtype)='M' begin if YEAR(GETDATE())!=YEAR(@IDDateOld)or MONTH(GETDATE())!=MONTH(@IDDateOld) begin set @maxid=1 end set @vRet=@year+@month+right('00000000'+cast(@maxid as varchar(8)),@idlen); set @maxid=@maxid+1; end else begin set @idtype='D'; if YEAR(GETDATE())!=YEAR(@IDDateOld)or MONTH(GETDATE())!=MONTH(@IDDateOld)or DAY(GETDATE())!=DAY(@IDDateOld) begin set @maxid=1 end set @vRet=@year+@month+@day+right('00000000'+cast(@maxid as varchar(8)),@idlen); set @maxid=@maxid+1; end end if @IDDateOld is null begin insert into IDInfo select @idname,@maxid,GETDATE(),@idtype,@idlen,@vRet end else begin update IDInfo set MaxID=@maxid,IDDate=GETDATE(),IDValue=@vRet where IDName=@idname; end end try begin catch set @error=1; end catch if @error=0 commit tran; else rollback tran; select @vRet; end --调用存储过程,生成单据编号 ----参数1:varchar(20) 自定义,表示单据名称 ----参数2:日期规则,(Y或M或D),Y(年)例:2017,M(年月)例:201711,D(年月日)例:20171113 ----参数3:自增号码长度,最值范围(4-8),例:0001,00000001 ----注:根据参数2的不同,隔年或隔月或隔天后,编号起始号从1开始 exec dbo.P_YFY_GETID 'A单据编号','D',8
日月路明 2017-11-13
  • 打赏
  • 举报
回复
写个函数就行了 if Object_id('charInc') is not null drop function CharInc go create function CharInc (@str varchar(20)) returns varchar(20) as BEGIN declare @idx int,@s varchar(20) set @idx=1 while @idx<=len(@str) BEGIN set @s=substring(@str,@idx,20) if IsNumeric(@s)=1 break set @idx=@idx+1 END if @idx>Len(@str) set @s='0' set @s=cast(@s as int)+1 if @idx<=Len(@str) set @s=right('0000000'+@s,Len(@str)-@idx+1) set @s=left(@str,@idx-1)+@s return( @s) END go 例如: select a=dbo.CharInc('abc00008'),b=dbo.CharInc('abc') --------------------- a b -------------------- -------------------- abc00009 abc1 (所影响的行数为 1 行)
weixin_41025033 2017-11-11
  • 打赏
  • 举报
回复
就是不会调用 要不你帮我全部写出来我 直接用 好了 谢谢
  • 打赏
  • 举报
回复
引用 2 楼 weixin_41025033 的回复:
XD0000021711100003这个是单据号,在表里是不允许重复 ,现在就是向插入的时候XD00000217111不变 后面开始从00003递增
declare @SHEET_NO varchar(18) ,@tmp int
 
set @SHEET_NO ='XD0000021711100003';

select @SHEET_NO
select @tmp=cast(reverse(substring(reverse(@SHEET_NO),PATINDEX('%[0-9]%',reverse(@SHEET_NO)),5))as int)+1
select substring(@SHEET_NO,1,len(@SHEET_NO)-5)+right ('00000'+cast(@tmp as VARCHAR(5)),5)
运行结果
XD0000021711100004
语句是这样,你自己建立函数然后调用即可。要写触发器调用也行
weixin_41025033 2017-11-11
  • 打赏
  • 举报
回复
XD0000021711100003这个是单据号,在表里是不允许重复 ,现在就是向插入的时候XD00000217111不变 后面开始从00003递增
  • 打赏
  • 举报
回复
额,首先确定你这个varchar类型的字符能确定转成int,其次,你的意思是在原来数据的基础上加1。 比如原来是‘1000’ 插入的数据就是‘1001’对吧。那么写触发器吧,否则如何做到自动。你在语句上写不好吗?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧