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

关于SQL编号的问题
在SQL存储过程中:
CREATE PROCEDURE reserveorderno @a varchar(2)  AS
declare @y as varchar(2),@m as varchar(2),@l as varchar(4),@o as varchar(11)
set @y=right(cast(year(getdate()) as char(4)),2)
set @m=right('0'+cast(month(getdate()) as varchar(2)),2)
if (select count(*) from reserve where reserveno like @a+@y+'%' and len(reserveno)=11)>0 
select @l= right('000'+cast((right(max(reserveno),4)+1) as varchar(4)),4) from reserve where reserveno like @a+@y+'%' and len(reserveno)=11
else
select @l='0001'
set @o=@a+@y+'S'+@m+@l
select @o as orderno
GO
在页面调用语句:
<%Response.Charset = "GB2312" %>
<%
area=request("cust_area")
connstrdan="Driver={SQL Server};server=symserver;database=dan2003;uid=lxy;pwd=82910555623" 
Set conndan = Server.CreateObject("ADODB.Connection") 
conndan.Open connstrdan 
Set rs_goods= Server.CreateObject("ADODB.RecordSet") 
sql="exec quoteorderno @a="&area
Rs_goods.open sql,conndan
response.Write rs_goods("orderno")
%>

出现问题:
1、老是会出现编号不会自动更新的现象,就是会出现提示编号已存在的对话框
2、如果有几位一起调用的话,编号就会是一样的,只有一个能保存,其它保存就会出错

请高手指点,谢谢!

------解决方案--------------------
你那个编号的生成规律不够严密。
------解决方案--------------------
declare @y as varchar(2),@m as varchar(2),@l as varchar(4),@o as varchar(11)
set @y=right(cast(year(getdate()) as char(4)),2)
set @m=right('0'+cast(month(getdate()) as varchar(2)),2)
if (select count(*) from reserve where reserveno like @a+@y+'%' and len(reserveno)=11)>0  
select @l= right('000'+cast((right(max(reserveno),4)+1) as varchar(4)),4) from reserve where reserveno like @a+@y+'%' and len(reserveno)=11
else
select @l='0001'
set @o=@a+@y+'S'+@m+@l

这段编码生成代码没有作相关的判断,逻辑不够严谨
------解决方案--------------------
楼主这个存储过程只是select编号,没有update和insert语句?

如要保证编号延续且不重复

1、新增订单时只是max(reserveno)+1即可

2、保存术单时再取一遍,且同时update即可
------解决方案--------------------
引用:
PS:老是会出现编号不会自动更新的现象,就是会出现提示编号已存在的对话框,是网页调用存储过程的时候出现这种情况
你生成编号判断条件有问题
------解决方案--------------------
在表中添加唯一索引