【问题标题】:Use return type stored procedure in SQL在 SQL 中使用返回类型存储过程
【发布时间】:2018-01-31 03:57:06
【问题描述】:

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

我收到了这个错误

消息 102,第 15 级,状态 1,第 2 行
'2014-03-01' 附近的语法不正确。

这是我的存储过程:

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)。

这是我的结果

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

declare @paymentID as int

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

报错了

消息 102,第 15 级,状态 1,第 2 行
'2014-03-01' 附近的语法不正确。

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

【问题讨论】:

  • 为什么要传入一个名为 date 的变量,它实际上是一个 varchar,然后将其设置为硬编码值?日期应该是日期,而不是字符串。为什么要在这里麻烦一个参数?我建议在您的代码中添加一些格式,因为这看起来很痛苦。您还可以将参数 @trainer 作为字符串文字,而不是参数。
  • @SeanLange 这只是 stackoverflow 的一个测试示例,我有一个更大的程序
  • 因此您发布了一条错误消息,并希望有人能够破译一些未生成该消息的代码,并告诉您真实代码中的问题所在。你怎么指望有人这样做。您在此处发布的伪代码是一团糟。

标签: sql-server stored-procedures return scalar


【解决方案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

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      相关资源
      最近更新 更多