exec外部定义的变量不能在exec内部(@strtmp)引用的,可以用sp_executesql来代替exec,具体用法见联机帮助“sp_executesql”

解决方案 »

  1.   

    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