2017-08-22 4 views
0

J'ai créé une procédure stockée qui renvoie une valeur particulière, mais je ne parviens pas à stocker la valeur de retour de ma procédure stockée dans une variable scalaire.Utilisation de la procédure stockée du type de retour dans SQL

Je reçois cette erreur

Msg 102, niveau 15, état 1, ligne 2
syntaxe incorrecte près de '1/3/2014'.

Ceci est ma procédure stockée:

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 

Lorsque j'exécute la procédure

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

ce me montre dans mon dossier fenêtre de résultat (20170822001).

Ceci est mon résultat

mais lorsque je tente de stocker la valeur dans ma variable scalaire comme celui-ci

declare @paymentID as int 

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

Il jette une erreur

Msg 102, Niveau 15, State 1, Line 2
Syntaxe incorrecte près de '2014-03-01'.

Qu'est-ce qui ne va pas ici? Que dois-je faire pour stocker la valeur de sortie dans ma variable scalaire?

+0

double possible de [Comment retourner la sortie de procédure stockée dans une variable dans le serveur SQL] (https://stackoverflow.com/questions/11965269/how-to-return-the-output -de-procédure-stockée-dans-un-serveur-de-variable-dans-sql) – scsimon

+0

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

+1

Pourquoi passez-vous une variable nommée date que est en fait un varchar et ensuite le définir à une valeur codée en dur? Les dates doivent être des dates, pas des chaînes. Et pourquoi s'embêter avec un paramètre ici? Je suggère d'ajouter un formatage à votre code, car c'est douloureux à regarder. Vous avez aussi vos paramètres @trainer sous forme de littéraux de chaîne, pas de paramètres. –

Répondre

1

Le code que vous avez publié comporte de nombreux problèmes. Le premier problème est que vous avez défini @paymentid comme un int, mais vous mettez trop de caractères dans la chaîne pour qu'il puisse entrer dans un int.

La valeur par défaut que vous avez est 20170822001 mais ce n'est pas une valeur entière valide. Vous allez devoir utiliser varchar (11) ou plus.

Votre procédure entière pourrait être grandement simplifiée donc quelque chose dans ce sens. Puisque vous ne pouvez pas utiliser un int, vous devrez utiliser un paramètre OUTPUT au lieu d'une valeur de retour. Je ne pense pas que ce soit tout à fait correct, mais vous avez déclaré que ce code n'est qu'une sorte de genre de ce que votre code réel est de toute façon.

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