【问题标题】:Stored Procedure Return Value Error存储过程返回值错误
【发布时间】:2015-07-16 05:27:41
【问题描述】:

我已经写了这个存储过程

ALTER PROCEDURE [dbo].[SP_InsertUpdate_Customer]
(    
     @cfname varchar(200),
     @clname varchar(200),
     @address1 varchar(200),
     @address2 varchar(200),
     @city varchar(200),
     @pincode varchar(50),
     @mobileno varchar(20),
     @brno int,
     @birthdate datetime,
     @age int,
     @gender char,
     @email varchar(50),
     @bal float,
     @acctype varchar(200),
     @opendate date,
     @flag int,
     @vchrMsg varchar(200) output
)
AS
BEGIN
    begin transaction t1    
    begin try


        declare @dt varchar(200)
        declare @no varchar(200)
        declare @cust_id varchar(200)
        declare @accno varchar(200)

        set @dt= (CONVERT(VARCHAR(24), GETDATE(), 126))


        if(@flag=1) 
        BEGIN

            SET @dt= CONVERT(VARCHAR(200), GETDATE(), 126);
            exec @dt= dbo.RemoveNonAlphaCharacters @dt;
            select @cust_id = CONCAT((LEFT(@cfname,1)),(LEFT(@clname,1))) 
            SET @no= CONCAT(@cust_id,@dt);
            SELECT CAST(@brno as varchar(200))
            SET @accno='123'

            insert into tbl_customer(cust_id, cust_fname, cust_lname, cust_bdate, cust_age, cust_address1, cust_address2, cust_city, cust_zipcode, cust_gen, cust_contactno, cust_brno, cust_accno, cust_balance, cust_acctype, cust_opendate, IsActive)
            values(@no, @cfname, @clname, @birthdate, @age, @address1, @address2, @city, @pincode, @gender, @mobileno, @brno, @accno, @bal, @acctype, @opendate, 'Y')

            set @vchrMsg=@cust_id----successfully inserted
        END
    end try
    begin catch
        set @vchrMsg=ERROR_MESSAGE()
        PRINT @vchrMsg
        rollback transaction t1
        return
    end catch
    commit transaction t1
END

select Msg = @vchrMsg;
return @vchrMsg;
Print @vchrMsg

现在当我试图执行这条语句时:

exec SP_InsertUpdate_Customer 'Anup'
                             ,'Patil'
                             ,'demo'
                             ,'demo'
                             ,'demo'
                             ,'07029'
                             ,'000000000'
                             ,123
                             ,'03/02/1989'
                             ,25
                             ,'M'
                             ,'anuppatil007@gmail.com'
                             ,200
                             ,'demo'
                             ,'07/16/2015'
                             ,1,''

我收到此错误:

消息 245,级别 16,状态 1,过程 SP_InsertUpdate_Customer,第 90 行
将 varchar 值“AP”转换为数据时转换失败 输入整数。

请帮我整理一下..

【问题讨论】:

  • “AP”值存储在哪一列?
  • dbo.RemoveNonAlphaCharacters 检查这个存储过程或函数
  • 提供dbo.RemoveNonAlphaCharacters的代码
  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀!
  • 存储过程的返回值只能INT - 通常用于指示受存储过程影响的行数,或指示错误情况。您不能使用 RETURN 从存储过程返回 varchar 消息 - 您需要改用 OUTPUT 参数或 SELECT 结果集

标签: sql sql-server-2012


【解决方案1】:

从 sproc 定义中删除最后三行,因为这不是必需的:

--select Msg = @vchrMsg;
--return @vchrMsg;
--Print @vchrMsg

并将 sp 执行为:

declare @vchrMsg varchar(200)
exec SP_InsertUpdate_Customer 'Anup'
                             ,'Patil'
                             ,'demo'
                             ,'demo'
                             ,'demo'
                             ,'07029'
                             ,'000000000'
                             ,123
                             ,'03/02/1989'
                             ,25
                             ,'M'
                             ,'anuppatil007@gmail.com'
                             ,200
                             ,'demo'
                             ,'07/16/2015'
                             ,1,@vchrMsg out
select @vchrMsg

此外,请记住 OUTPUTRETURN 关键字有不同的用途。Return 的值始终是 INT

编辑: DEMO

【讨论】:

  • 我试过了..现在错误消失了..但没有插入记录...它说 1 行受影响但表中不存在记录,
  • 不应该这样..检查演示..它运行良好..让我知道实际情况不同的地方..
  • 好的..它显示custId..但仍然没有在表中插入记录..我在我的sql查询编辑器中尝试了确切的代码..
  • Yaa.. 出错了.. 我在同一张表上创建了触发器而不是插入.. 如果我禁用此触发器,则插入值.. 但即使我想让触发器工作.. 我怎么能做吗? T
【解决方案2】:

使用

SELECT @vchrMsg AS Message;

代替

  return @vchrMsg;

存储过程的返回类型始终为Int(返回受影响的行数或出错时的错误代码)。

【讨论】:

    猜你喜欢
    • 2014-05-15
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多