create procedure sp_create_projectcode ( @No char(12) OutPut)/*输出参数*/ As--Begin Tran --^^没有改变数据,不用事务 Declare @us_year char(4) --请去掉分号 -- ^^^^^ Declare @us_projectcode char(12) Declare @ui_projectcode int Select @us_year=convert(char(4),datepart(year,getdate())) --年度 -- ^^^^ Select @us_projectcode=max(projectcode) from project--最大值 IF @us_projectcode is null begin set @us_projectcode='00000001' Set @ui_projectcode=convert(int,@us_projectcode)+1 Set @No=@us_year+replicate('0',8-len(convert(char(8),@ui_projectcode)))+convert(varchar(8),@ui_projectcode) if(@@error<>0) --^^^这里@@error<>0表示有错误 -- commit --提交 --^^没有数据修改不必提交 -- else begin -- rollback --^^ set @No=null--表示取值失败 end End go
以上还有一个错误,去掉没用的注释后:create procedure sp_create_projectcode ( @No char(12) OutPut)/*输出参数*/ AsDeclare @us_year char(4) --请去掉分号 Declare @us_projectcode char(12) Declare @ui_projectcode int Select @us_year=convert(char(4),datepart(year,getdate())) --年度 Select @us_projectcode=max(projectcode) from project--最大值IF @us_projectcode is null set @us_projectcode='00000001'Set @ui_projectcode=convert(int,@us_projectcode)+1 Set @No=@us_year+replicate('0',8-len(convert(char(8),@ui_projectcode)))+convert(varchar(8),@ui_projectcode)if(@@error<>0) set @No=null --表示取值失败 go
( @No char(12) OutPut)/*输出参数*/
As--Begin Tran
--^^没有改变数据,不用事务
Declare @us_year char(4) --请去掉分号
-- ^^^^^
Declare @us_projectcode char(12)
Declare @ui_projectcode int
Select @us_year=convert(char(4),datepart(year,getdate())) --年度
-- ^^^^
Select @us_projectcode=max(projectcode) from project--最大值
IF @us_projectcode is null
begin
set @us_projectcode='00000001'
Set @ui_projectcode=convert(int,@us_projectcode)+1
Set @No=@us_year+replicate('0',8-len(convert(char(8),@ui_projectcode)))+convert(varchar(8),@ui_projectcode) if(@@error<>0)
--^^^这里@@error<>0表示有错误
-- commit --提交
--^^没有数据修改不必提交
-- else
begin
-- rollback
--^^
set @No=null--表示取值失败
end
End
go
( @No char(12) OutPut)/*输出参数*/
AsDeclare @us_year char(4) --请去掉分号
Declare @us_projectcode char(12)
Declare @ui_projectcode int
Select @us_year=convert(char(4),datepart(year,getdate())) --年度
Select @us_projectcode=max(projectcode) from project--最大值IF @us_projectcode is null
set @us_projectcode='00000001'Set @ui_projectcode=convert(int,@us_projectcode)+1
Set @No=@us_year+replicate('0',8-len(convert(char(8),@ui_projectcode)))+convert(varchar(8),@ui_projectcode)if(@@error<>0)
set @No=null --表示取值失败
go
to:am2000(最后一滴水)
如果要控制多用户,用上面的方法是没用的。即使你在取项目编码时,对表进行加锁,但退出时
没有立即更新表中的最大项目编码。那么在更新表中的最大项目编码之前,另一用户执行上面储存过程和上一用户取到的还是一样的项目编码。
你可以建一张编号表,存放单前最大编号,取编号时从编号表取,在过程中立即更新编号表单前最大编号。但有一个缺点,不能保证编号会连续。
要想控制多用户,即使使用表级锁,但存储过程执行完,表级锁将释放,在没有将新得到的项目编号插入之前,如果有另一个用户也执行这个存储过程,就会出现两个相同的项目编号。
所以建议将取最大编号和插入操作放在同一个存储过程中,并放在一个事务中执行,执行过程中设置表级锁就可以了。
bluepower2008(蓝色力量)的思路也是不行的啊。我觉得。
我的思路是插入时自动生成编码,这样的话,保存的时候无法实现多用户的。
有没有比较好的思路?在不改变需求的情况下...
bluepower2008(蓝色力量)的思路当然可行,我现在做的就是照他的思路做成的.万试万灵呀.
另外,上次的程序:create procedure sp_create_projectcode
( @No char(12) OutPut)/*输出参数*/
AsDeclare @us_year char(4) --请去掉分号
Declare @us_projectcode char(12)
Declare @ui_projectcode int
Select @us_year=convert(char(4),datepart(year,getdate())) --年度
Select @us_projectcode=max(projectcode) from project--最大值
-- ^^^^这里取出的应该带年份
IF @us_projectcode is null
set @us_projectcode='000000000001'Set @ui_projectcode=convert(int,substring(@us_projectcode,5,8)+1
-- ^^^应去掉年份Set @No=@us_year+replicate('0',8-len(convert(char(8),@ui_projectcode)))+convert(varchar(8),@ui_projectcode)if(@@error<>0)
set @No=null --表示取值失败
go
( @No char(12) OutPut)/*输出参数*/
AsDeclare @us_year varchar(4) --请去掉分号
--^^
Declare @us_projectcode char(12)
Declare @ui_projectcode int
Select @us_year=convert(char(4),datepart(year,getdate())) --年度
Select @us_projectcode=max(projectcode) from project where projectcode like @us_year+'%'
-- ^^^^这里取出的应该带年份 加条件考虑换年的情况
IF @us_projectcode is null
set @us_projectcode='000000000001'Set @ui_projectcode=convert(int,substring(@us_projectcode,5,8)+1
-- ^^^应去掉年份Set @No=@us_year+replicate('0',8-len(convert(char(8),@ui_projectcode)))+convert(varchar(8),@ui_projectcode)if(@@error<>0)
set @No=null --表示取值失败
go