it-swarm.com.de

IF/ELSE-gespeicherte Prozedur

Kann jemand bitte darauf hinweisen, was ich mit diesem gespeicherten Verfahren falsch mache. Ich kann es nicht kompilieren und meine Software gibt keine nützlichen Hinweise, was daran falsch ist.

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 hat recht. Der nächste Fehler ist der else-Befehl else if (Sie haben derzeit einen booleschen Ausdruck in Ihrem else, der keinen Sinn macht). Hier ist was es sein sollte

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

Sie haben derzeit folgendes (was falsch ist):

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

Hier ist ein Tipp für die Zukunft: Doppelklicken Sie auf den Fehler, und SQL Server Management Studio geht in die Zeile, in der sich der Fehler befindet. Wenn Sie glauben, dass SQL Server kryptische Fehler gibt (was ich nicht glaube), dann haben Sie nicht mit Oracle gearbeitet!

16
RichardOD

Es gibt keine Fehler? Versuchen Sie es
SET @tmpType = 'premium'
und
SET @tmpType = 'basic'

8
Nick

Fehlt die 'SET'-Anweisung, wenn Sie Ihre Variablen im IF .. ELSE-Block zuweisen?

3
TLiebe

versuchen 

set @tmptype
1
HLGEM

ja, Nick hat recht.

Sie müssen SET oder SELECT verwenden, um @tmpType zuzuweisen

1
Johnno Nolan

Versuchen Sie dies mit SQL-Join-Anweisungen

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

Nur ein Tipp dafür, Sie brauchen weder BEGIN noch END, wenn es nur eine einzige Anweisung enthält.

dh:

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