急!生成流水号的问题!

huanshayi 2011-04-20 09:22:54
我先上代码:

--这是一个触发器:
CREATE trigger [dbo].[T_PartValuation_AfterInsert]
on [dbo].[PartValuation]
After Insert
as
--在添加数据后生成流水号并update
declare @ValuationCode nvarchar(50),@ValuationID int
set @ValuationID=@@IDENTITY
exec P_CustomerInquiry_CreateCode @ValuationCode out
update PartValuation set ValuationCode=@ValuationCode where ValuationID=@ValuationID



--这是生成编码(编码分两步生成,最后合并)的存储过程:
CREATE PROCEDURE [dbo].[P_PartValuation_CreateCode] @ValuationCode nvarchar(50) output
as
--对客户估价表进行生成流水号
declare @count int,@num int
--先生成例如:20110419 的前半部分
set @ValuationCode = convert(nvarchar(50),getdate(),112)
--获取今天已经生成多少个类似这样的(这里主要防止未生成)
select @count=count(*) from dbo.PartValuation where ValuationCode like (@ValuationCode+'%')
--如果尚未生成,则设置编号为0,否则获取最大的编号
if (@count = 0)
begin
set @num = 0
end
else
begin
select @num=cast(substring(MAX(ValuationCode),9,4) as int) from dbo.PartValuation where ValuationCode like (@ValuationCode+'%')
end
--在最大的编号的基础上+1
set @num = @num + 1
--这里我主要是想生成四位的编号并且与之前生成的前半部分合并,例如201104190001等
if (@num<10)
begin
set @ValuationCode = @ValuationCode + '000' + cast(@num as nvarchar(20))
end
else if (@num < 100)
begin
set @ValuationCode = @ValuationCode + '00' + cast(@num as nvarchar(20))
end
else if (@num < 1000)
begin
set @ValuationCode = @ValuationCode + '0' + cast(@num as nvarchar(20))
end
else
begin
set @ValuationCode = @ValuationCode + cast(@num as nvarchar(20))
end

以上是我的逻辑代码,我代码的逻辑应该没错的,后四位生成,第一次0001没问题,第二次0002没问题,第三次0002有问题,以后都是生成0002的了,请教怎么会这样,我的逻辑没错的吧
...全文
174 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shabble 2011-04-20
  • 打赏
  • 举报
回复
学习了,简化后看着清楚多了
tengjian1981 2011-04-20
  • 打赏
  • 举报
回复
最后一个end去掉
tengjian1981 2011-04-20
  • 打赏
  • 举报
回复

LZ我帮你简化一下存储过程吧



CREATE PROCEDURE [dbo].[P_PartValuation_CreateCode] @ValuationCode nvarchar(50) output
as
--对客户估价表进行生成流水号
declare @num int
--先生成例如:20110419 的前半部分
set @ValuationCode = convert(nvarchar(50),getdate(),112)
--获取今天已经生成多少个类似这样的(这里主要防止未生成)

select @num=isnull(MAX(cast(substring(ValuationCode,9,4) as int)),0)+1 from dbo.PartValuation where ValuationCode like (@ValuationCode+'%')

set @ValuationCode = @ValuationCode + right('000' + cast(@num as nvarchar(20)),4)
end




tengjian1981 2011-04-20
  • 打赏
  • 举报
回复


这步错了,应该最后再用MAx

select @num=MAX(cast(substring(ValuationCode,9,4) as int)) from dbo.PartValuation where ValuationCode like (@ValuationCode+'%')


快溜 2011-04-20
  • 打赏
  • 举报
回复
生成流水号要这么复杂吗
--小F-- 2011-04-20
  • 打赏
  • 举报
回复
触发器每次只能更新一行
huanshayi 2011-04-20
  • 打赏
  • 举报
回复
我先试试,感觉各位热情回答

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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