web-dev-qa-db-fra.com

Procédure mémorisée IF/ELSE

Quelqu'un peut-il s'il vous plaît indiquer ce qui ne va pas avec cette procédure stockée s'il vous plaît. Je ne parviens pas à le compiler et mon logiciel ne donne pas d’indices utiles sur son problème.

CREATE PROCEDURE web.createSubscriptions
   (
   @Member_Id BIGINT,
   @Trans_type VARCHAR(100),
   @Payment_Status VARCHAR(100),
   @Payment_Date DATETIME,
   @Trans_Id VARCHAR(100)
   )

AS
DECLARE @tmpType VARCHAR(15)
BEGIN

INSERT INTO TBL_SUBSCRIPTIONS (subs_MemberID, subs_Type, subs_Status, subs_DateGenerated, subs_PaypalTransaction) VALUES(@Member_Id, @Trans_Type, @Payment_Status, @Payment_Date, @Trans_Id)

IF(@Trans_type = 'subscr_signup')
    BEGIN
    @tmpType = 'premium'
    END
ELSE(@Trans_type = 'subscr_cancel')
    BEGIN
    @tmpType = 'basic'
    END

UPDATE TBL_MEMBERS
SET members_Type = @tmpType
WHERE members_Id = @Member_Id

END
14
Munklefish

Nick a raison. La prochaine erreur est le else devrait être else if (vous avez actuellement une expression booléenne dans votre else qui n'a aucun sens). Voici ce qu'il devrait être

ELSE IF(@Trans_type = 'subscr_cancel')
    BEGIN
    SET @tmpType = 'basic'
    END

Vous avez actuellement les éléments suivants (ce qui est faux):

ELSE(@Trans_type = 'subscr_cancel')
    BEGIN
    SET @tmpType = 'basic'
    END

Voici un conseil pour l’avenir. Double-cliquez sur l’erreur et SQL Server Management Studio ira à la ligne où se trouve l’erreur. Si vous pensez que SQL Server génère des erreurs cryptiques (ce qui, à mon avis, n’est pas le cas), vous n’avez pas travaillé avec Oracle!

16
RichardOD

Cela ne donne aucune erreur? Essayez
SET @tmpType = 'premium'
et
SET @tmpType = 'basic'

8
Nick

L'instruction 'SET' vous manque-t-elle lorsque vous affectez vos variables dans le bloc IF .. ELSE?

3
TLiebe

essayer 

set @tmptype
1
HLGEM

ouais Nick a raison.

Vous devez utiliser SET ou SELECT pour affecter à @tmpType

1
Johnno Nolan

Essayez ceci avec les instructions de jointure SQL

CREATE PROCEDURE [dbo].[deleteItem]
   @ItemId int = 0  
 AS
 Begin
 DECLARE @cnt int;

SET NOCOUNT ON
SELECT @cnt =COUNT(ttm.Id) 
    from ItemTransaction itr INNER JOIN ItemUnitMeasurement ium 
        ON itr.Id = ium.ItemTransactionId  INNER JOIN ItemMaster im 
        ON itr.ItemId = im.Id INNER JOIN TransactionTypeMaster ttm 
        ON itr.TransactionTypeMasterId = ttm.Id 
        where im.Id = @ItemId

if(@cnt = 1)
    Begin
    DECLARE @transactionType varchar(255);
    DECLARE @mesurementAmount float;
    DECLARE @itemTransactionId int;
    DECLARE @itemUnitMeasurementId int;

        SELECT @transactionType = ttm.TransactionType,  @mesurementAmount = ium.Amount, @itemTransactionId = itr.Id, @itemUnitMeasurementId = ium.Id
        from ItemTransaction itr INNER JOIN ItemUnitMeasurement ium 
            ON itr.Id = ium.ItemTransactionId INNER JOIN TransactionTypeMaster ttm 
            ON itr.TransactionTypeMasterId = ttm.Id 
            where itr.ItemId = @ItemId  
        if(@transactionType = 'Close' and @mesurementAmount = 0)
            Begin
                delete from ItemUnitMeasurement where Id = @itemUnitMeasurementId;

            End
        else
            Begin
                delete from ItemTransaction where Id = @itemTransactionId;
            End
    End
else
 Begin
    delete from ItemMaster where Id = @ItemId;
 End

END
0
Dinesh Vaitage

Juste un conseil pour cela, vous n'avez pas besoin de BEGIN et END si elle ne contient qu'une seule déclaration.

c'est à dire:

IF(@Trans_type = 'subscr_signup')    
 set @tmpType = 'premium' 
ELSE iF(@Trans_type = 'subscr_cancel')  
     set    @tmpType = 'basic'
0
John