2017-08-22 17 views
0

特定の値を返すストアドプロシージャを作成しましたが、ストアドプロシージャの戻り値をスカラー変数に格納できません。戻り値の型ストアドプロシージャをSQLで使用

私はこのエラーに

メッセージ102、レベル15、状態1、行2
'2014年3月1日' 付近に不適切な構文を取得しています。

これは私のストアドプロシージャです:私は手順

exec SP_generatePaymentID '2014-03-01','Benzir Pinjari' 

を実行すると

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 

これは私に私の結果ウィンドウ(20170822001)のレコードを示しています。

これは私の結果

ですが、私はこの

declare @paymentID as int 

set @paymentID = SP_generatePaymentID '2014-03-01','Benzir Pinjari' 
select @paymentID 
それはメッセージ102エラー

を投げている

、レベルのように私のスカラー変数に値を格納しようとすると、 15、状態1、行2
'2014-03-01'の近くの構文が正しくありません。

ここで何が間違っていますか?出力値をスカラー変数に格納するにはどうすればよいですか?

+0

の可能性のある重複(https://stackoverflow.com/questions/11965269/how-to-return-the-output [SQLサーバー内の変数にストアドプロシージャの出力を返す方法]ストアドプロシージャをSQL Serverで変数に変換する) – scsimon

+0

https://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –

+1

なぜ変数nameにdate実際にはvarcharであり、ハードコードされた値に設定しますか?日付は文字列ではなく日付でなければなりません。そして、なぜここでパラメータを気にしますか?私はあなたのコードにいくつかの書式を追加することをお勧めします。また、@trainerというパラメータは、文字列リテラルであり、パラメータではありません。 –

答えて

1

投稿したコードには多くの問題があります。最初の問題は、あなたがintとして@paymentidを定義したことですが、文字列にあまりにも多くの文字を入れて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 
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