none
第一个存储过程调用第二个存储过程,显示错误“必须声明变量” RRS feed

  • 问题

  • 错误信息:服务器: 消息 137,级别 15,状态 2,行 1   必须声明变量 '@create_sucess'
    但事实上已经声明了此变量,请高人指点。


    ---输入参数:出租合同ID,审核人
    ---输出参数:创建账户个数,0为创建失败
    CREATE PROCEDURE [ReceivableAccount_CreatAccount_0]
    @audit_contractid varchar(2000),
    @audit_man char(30),
    @result int output
    AS
    declare @my_rentcontractid bigint
    declare @my_status int


    begin tran

    ---更新出租合同状态
    declare @mySql varchar(2000)

    set @mySql = 'update RentContracts set Audit_status=''已审'',Audit_man='''+ rtrim(@audit_man) +''',Audit_date=getdate() where rentcontractid in (' + @audit_contractid + ')'
    exec(@mySql)

    ---创建应收账户(总帐)
    set @result=0

    set @mySql = 'declare pcurr cursor for '
    set @mySql = @mySql + ' select rentcontractid from RentContracts where rentcontractid in ('+@audit_contractid+')'
    exec(@mySql)
    open pcurr  
    fetch next from pcurr into @my_rentcontractid
    while (@@fetch_status = 0)  
    begin
      declare @create_sucess int
      set @create_sucess=0
      set @mySql = N'execute ReceivableAccount_CreatAccount_1 '+cast(@my_rentcontractid as varchar(100))+',@create_sucess output'
      print(@@fetch_status)
      print (@mySql)
      
      ---这句出错,在查询分析器中错误信息为“服务器: 消息 137,级别 15,状态 2,行 1 必须声明变量 '@create_sucess'
      execute(@mySql)

      if @@error=0 and @create_sucess=0
        ---创建成功
        begin
         set @result=@result+1
         fetch next from pcurr into @my_rentcontractid
        end
      else
        begin
         set @result=0
         BREAK
        end
    end

    if @result=0
     begin
     set @result=0
     rollback tran
     end
    else commit tran
    close pcurr  
    deallocate pcurr
    GO

    存储过程2

    ---根据出租合同ID创建一个应收款账户
    ---输入参数:出租合同ID(@vcontractid)
    ---输出参数:0=成功,1=失败
    CREATE PROCEDURE [ReceivableAccount_CreatAccount_1]
    @input_rentcontractid bigint,
    @sucessCode tinyint output
    AS
     declare @rentcontractid bigint
     declare @project varchar(30)
     declare @roomlist varchar(500)
     declare @payperiod int
     declare @receivable_total bigint
     declare @received_total bigint
     declare @Balance int
     declare @BillingPeriodEnded bigint
     declare @Accountflag char(4)
     declare @Create_date datetime
     begin
       ---@roomlist=dbo.uf_splitstring(@input_rentcontractid),
       select
       @rentcontractid= rentcontractid,
       @project=(select top 1 project from RentRoomInfor,room where RentRoomInfor.rentcontractid=RentContracts.rentcontractid and RentRoomInfor.roomid=room.roomid),
       @roomlist='',
       @payperiod= payperiod,
       @receivable_total=0,
       @received_total =0,
       @Balance=0,
       @BillingPeriodEnded=null,
       @Accountflag='正常',
       @Create_date= getdate()
       from RentContracts
       where rentcontractid= @input_rentcontractid

       insert into AccountReceivable (rentcontractid,project,roomlist,payperiod,receivable_total,received_total,Balance,BillingPeriodEnded,Accountflag,Create_date)
    values (@rentcontractid,@project,rtrim(@roomlist),@payperiod,@receivable_total,@received_total,@Balance,@BillingPeriodEnded,@Accountflag,@Create_date)
        
          if @@error=0
            set @sucessCode=0
          else
           set @sucessCode=1
      end
    GO

    2010年2月1日 6:11

答案

  • 错误提示很明显了:必须声明变量 '@create_sucess'

    因为你是使用拼接的sql去执行 存储过程,在拼接的sql中 并没有这个变量的定义。

    1.建议不要使用拼接sql
    2.在拼接sql中加入 变量定义,ps,用分号分割即可在一行内写多个sql


    family as water
    2010年2月1日 6:18
  • 非常感谢,这个问题已经解决。
    现又出现另一个问题:服务器: 消息 208,级别 16,状态 1,过程 ReceivableAccount_CreatAccount_1,行 21 对象名 'dbo.uf_splitstring' 无效。

    uf_splitstring是一个自定义函数,在查询分析器中直接执行也显示 'u_splitstring' 不是可以识别的 函数名。

    请问这会是哪些原因?


    dbo.uf_splitstring--是什麼類型的函數'FN', 'IF', 'TF'
    純量函數
    內嵌資料表函數
    資料表函數

    如果是純量函數可以這樣引用,所有者為dbo也需要正確

    use 數據庫
    go
    
    select * from sysobjects where XType in('FN', 'IF', 'TF')--查看是否存在


    ROY WU(吳熹)
    2010年2月1日 12:53
    版主

全部回复

  • 错误提示很明显了:必须声明变量 '@create_sucess'

    因为你是使用拼接的sql去执行 存储过程,在拼接的sql中 并没有这个变量的定义。

    1.建议不要使用拼接sql
    2.在拼接sql中加入 变量定义,ps,用分号分割即可在一行内写多个sql


    family as water
    2010年2月1日 6:18
  • 非常感谢,这个问题已经解决。
    现又出现另一个问题:服务器: 消息 208,级别 16,状态 1,过程 ReceivableAccount_CreatAccount_1,行 21 对象名 'dbo.uf_splitstring' 无效。

    uf_splitstring是一个自定义函数,在查询分析器中直接执行也显示 'u_splitstring' 不是可以识别的 函数名。

    请问这会是哪些原因?

    2010年2月1日 6:38
  • 你可以尝试先运行包含该函数的脚本,让dbo中包含uf_splitstring这个函数对象。
    如果uf_splitstring和需要运行的脚步在同一个文件中,uf_splitstring函数就应该放在调用该函数的语句之前。

    2010年2月1日 7:57
  • 非常感谢,这个问题已经解决。
    现又出现另一个问题:服务器: 消息 208,级别 16,状态 1,过程 ReceivableAccount_CreatAccount_1,行 21 对象名 'dbo.uf_splitstring' 无效。

    uf_splitstring是一个自定义函数,在查询分析器中直接执行也显示 'u_splitstring' 不是可以识别的 函数名。

    请问这会是哪些原因?


    dbo.uf_splitstring--是什麼類型的函數'FN', 'IF', 'TF'
    純量函數
    內嵌資料表函數
    資料表函數

    如果是純量函數可以這樣引用,所有者為dbo也需要正確

    use 數據庫
    go
    
    select * from sysobjects where XType in('FN', 'IF', 'TF')--查看是否存在


    ROY WU(吳熹)
    2010年2月1日 12:53
    版主