在SQL中使用返回类型存储过程

时间:2017-08-22 18:45:26

标签: sql-server stored-procedures return scalar

我创建了一个返回特定值的存储过程,但是我无法将存储过程的返回值存储在标量变量中。

我收到此错误

  

Msg 102,Level 15,State 1,Line 2
  “2014-03-01”附近的语法不正确。

这是我的存储过程:

keyPathsForValuesAffectingPreview

执行程序时

ALTER PROCEDURE SP_generatePaymentID
    @date nvarchar(50),
    @trainer nvarchar(50)
AS
BEGIN
    DECLARE @result as int
    DECLARE @paymentid as int

    SET @date='2017-08-22'
    SET @result = (SELECT COUNT(*) FROM finalinstructoreexpense 
                   WHERE date = @date AND trainer = '@trainer')

    IF (@result = 0)
    BEGIN
        SET @paymentid = (SELECT REPLACE(CONVERT(CHAR(10), @date, 103), '-', ''))
        SELECT CAST(@paymentid AS NVARCHAR(MAX)) + '001'
    END
    ELSE
    BEGIN
        SET @paymentid = (SELECT TOP 1 paymentid 
                          FROM finalinstructoreexpense 
                          WHERE date = @date AND trainer = '@trainer' 
                          ORDER BY paymentid DESC)
        SELECT @paymentid + 1
    END

    RETURN @paymentid
END

这是在我的结果窗口(exec SP_generatePaymentID '2014-03-01','Benzir Pinjari' )中显示我的记录。

这是我的结果

但是当我尝试将值存储在我的标量变量中时,就像这样

20170822001

抛出错误

  

Msg 102,Level 15,State 1,Line 2
  “2014-03-01”附近的语法不正确。

这里有什么问题?我需要做什么才能将输出值存储在我的标量变量中?

2 个答案:

答案 0 :(得分:1)

您发布的代码存在许多问题。第一个问题是你已经将@paymentid定义为一个int,但是你在字符串中放了太多字符以使其适合int。

您拥有的默认值是20170822001,但这不是有效的整数值。您将不得不使用varchar(11)或更长时间。

你的整个过程可以大大简化,所以这些都是这样的。由于您不能使用int,因此您必须使用OUTPUT参数而不是返回值。我不认为这是完全正确的,但你说这段代码有点像你真正的代码那样。

declare @date nvarchar(50),
@trainer nvarchar(50)
declare @result as int
declare @paymentid as varchar(20)
set @date='2017-08-22'

--set the default value first
set @paymentid = convert(varchar(100), REPLACE(CONVERT(CHAR(10), @date, 103), '-', '')) +'001'

select @paymentid

--if there are no rows returned from this query the value of @paymentid will not be changed
select @paymentid = convert(varchar(10), MAX(paymentid) + 1)
from finalinstructoreexpense 
where date = @date 
    and trainer = @trainer

答案 1 :(得分:0)

declare @paymentID as int
set @paymentID =SP_generatePaymentID '2014-03-01','Benzir Pinjari'
select @paymentID

please use "Exec" instead of set

declare @paymentID as int
EXEC  @paymentID = SP_generatePaymentID '2014-03-01','Benzir Pinjari'
select @paymentID
相关问题