CREATE PROCEDURE ReadDh @yijbm varchar(3), @erjbm varchar(3), @sajbm varchar(3), @sijbm varchar(4), @TableName varchar(20),@FieldName varchar(10),@NewDh varchar(12) Output,@State integer output AS --@State变量,0成功,1失败,2服务器时间小于单号时间 --服务器上现在时间 Declare @NowDate char(8) --Dh单号,DhDate单号中的时间 Declare @Dh varchar(12),@DhDate char(8) --生成语句的变量 Declare @Strtmp nvarchar(4000) --**** 这里修改了定义 ****----生成服务器的时间。 If month(getdate())<10 Select @NowDate=Ltrim(str(datepart(yyyy,getdate())))+'0'+Ltrim(str(datepart(mm,getdate())))+Ltrim(str(datepart(dd,getdate()))) Else Select @NowDate=Ltrim(str(datepart(yyyy,getdate())))+Ltrim(str(datepart(mm,getdate())))+Ltrim(str(datepart(dd,getdate())))--找出单号 Set @Strtmp='Begin Transaction' Set @Strtmp=@Strtmp+' Select @Dh='+@FieldName+' From '+@TableName+' RowLock Where yijbm='''+@yijbm+''' and erjbm='''+@erjbm+''' and sajbm='''+@sajbm+''' and sijbm='''+@sijbm+'''' Set @Strtmp=@strtmp+' Waitfor delay ''00:00:05''' Set @Strtmp=@Strtmp+' Commit' --Exec(@Strtmp) --**** 改成下面这句 ****-- exec sp_executesql @Strtmp,N'@dh varchar(12) out',@dh out--生成单号时间 Set @DhDate=left(@Dh,8) If @NowDate>=@DhDate Begin If @NowDate>@DhDate Set @Dh=@NowDate+'0001' Else Set @Dh=@NowDate+Right('0000'+Str(Right(@Dh,4)+1),4) --更新 BEGIN TRANSACTION UpdateDh Set @Strtmp=' Update '+@TableName+' Set '+@FieldName+'=@Dh where yijbm='''+@yijbm+''' and erjbm='''+@erjbm+''' and sajbm='''+@sajbm+'''' Set @Strtmp=@Strtmp+' and sijbm='''+@sijbm+''' WaitFor delay ''00:00:05''' --Exec(@Strtmp) --**** 改成下面这句 ****-- exec sp_executesql @Strtmp,N'@dh varchar(12) ',@dh if @@ERROR<>0 Begin ROLLBACK TRANSACTION UpdateDh --更新单号失败 Set @State=1 Set @NewDh=@Dh Return End COMMIT TRANSACTION UpdateDh --更新成功 Set @State=0 Set @NewDh=@Dh End Else --服务器时间小于单号时间 Set @State=2 GO
@yijbm varchar(3),
@erjbm varchar(3),
@sajbm varchar(3),
@sijbm varchar(4), @TableName varchar(20),@FieldName varchar(10),@NewDh varchar(12) Output,@State integer output
AS
--@State变量,0成功,1失败,2服务器时间小于单号时间
--服务器上现在时间
Declare @NowDate char(8)
--Dh单号,DhDate单号中的时间
Declare @Dh varchar(12),@DhDate char(8)
--生成语句的变量
Declare @Strtmp nvarchar(4000) --**** 这里修改了定义 ****----生成服务器的时间。
If month(getdate())<10
Select @NowDate=Ltrim(str(datepart(yyyy,getdate())))+'0'+Ltrim(str(datepart(mm,getdate())))+Ltrim(str(datepart(dd,getdate())))
Else
Select @NowDate=Ltrim(str(datepart(yyyy,getdate())))+Ltrim(str(datepart(mm,getdate())))+Ltrim(str(datepart(dd,getdate())))--找出单号
Set @Strtmp='Begin Transaction'
Set @Strtmp=@Strtmp+' Select @Dh='+@FieldName+' From '+@TableName+' RowLock Where yijbm='''+@yijbm+''' and erjbm='''+@erjbm+''' and sajbm='''+@sajbm+''' and sijbm='''+@sijbm+''''
Set @Strtmp=@strtmp+' Waitfor delay ''00:00:05'''
Set @Strtmp=@Strtmp+' Commit'
--Exec(@Strtmp) --**** 改成下面这句 ****--
exec sp_executesql @Strtmp,N'@dh varchar(12) out',@dh out--生成单号时间
Set @DhDate=left(@Dh,8)
If @NowDate>=@DhDate
Begin
If @NowDate>@DhDate
Set @Dh=@NowDate+'0001'
Else
Set @Dh=@NowDate+Right('0000'+Str(Right(@Dh,4)+1),4)
--更新
BEGIN TRANSACTION UpdateDh
Set @Strtmp=' Update '+@TableName+' Set '+@FieldName+'=@Dh where yijbm='''+@yijbm+''' and erjbm='''+@erjbm+''' and sajbm='''+@sajbm+''''
Set @Strtmp=@Strtmp+' and sijbm='''+@sijbm+''' WaitFor delay ''00:00:05'''
--Exec(@Strtmp) --**** 改成下面这句 ****--
exec sp_executesql @Strtmp,N'@dh varchar(12) ',@dh
if @@ERROR<>0
Begin
ROLLBACK TRANSACTION UpdateDh
--更新单号失败
Set @State=1
Set @NewDh=@Dh
Return
End
COMMIT TRANSACTION UpdateDh
--更新成功
Set @State=0
Set @NewDh=@Dh
End
Else
--服务器时间小于单号时间
Set @State=2
GO