我创建了一个返回特定值的存储过程,但是我无法将存储过程的返回值存储在标量变量中。
我收到此错误
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”附近的语法不正确。
这里有什么问题?我需要做什么才能将输出值存储在我的标量变量中?
答案 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