2009-11-06 16 views
13

Czy ktoś może wskazać, co robię źle w tej procedurze przechowywanej proszę. Nie mogę go skompilować i moje oprogramowanie nie daje żadnych przydatnych wskazówek, co jest z nim nie tak.Procedura składowana IF/ELSE

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 

Odpowiedz

15

Nick ma rację. Następny błąd jest inny powinien być else, jeśli (masz obecnie wyrażenie boolean w swoim innym, co nie ma sensu). Oto, co powinno być

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

Masz obecnie następujące (co jest źle):

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

Oto wskazówka dla przyszłościowej podwójne kliknięcie na błąd i SQL Management Server Studio pójdzie do linii, w której znajduje się błąd. Jeśli uważasz, że SQL Server daje tajemnicze błędy (co, jak sądzę, nie robi), to nie pracujesz z Oracle!

+0

Dziękuję. Głupi błąd do zrobienia. ;-( – Munklefish

+0

Cieszę się, że jest już posortowane – RichardOD

+0

@Munklefish hej, ale cieszę się, że to zrobiłeś (nie, że jestem zły, ale ..) ponieważ to pomogło mi z jednym podstawowym pytaniem, które myślałem o SQL: P –

8

Nie daje żadnych błędów? Spróbuj
SET @tmpType = 'premium '
i
SET @tmpType = 'basic'

+0

Właśnie próbowałem tego i to zwraca następujący błąd unhelpful Niepoprawna składnia w pobliżu '@Trans_type'. – Munklefish

+0

To zdecydowanie część problemu. – RichardOD

+0

Moja odpowiedź ma następną poprawkę. :-) – RichardOD

1

spróbować

set @tmptype 
+0

Właśnie próbowałem tego i to zwraca następujące nieprzydatny błędu „Niepoprawna składnia w pobliżu«@Trans_type»” – Munklefish

3

Brakuje Ci 'Ustaw' oświadczenie podczas przypisywania do zmiennych w bloku IF ELSE ..?

+0

Właśnie próbowałem tego i to zwraca następujące nieprzydatny błędu „Niepoprawna składnia w pobliżu«@Trans_type»” – Munklefish

1

tak, Nick ma rację.

Trzeba użyć SET lub SELECT przypisać @tmpType

+0

Właśnie wypróbowałem to i zwraca następujący niepomocny błąd "Niepoprawna składnia w pobliżu" @Trans_type "" – Munklefish

+0

Zobacz moją odpowiedź na następną poprawkę ... – RichardOD

-1

spróbować

IF(@Trans_type = 'subscr_signup')  
BEGIN 
set @tmpType = 'premium' 
END 
ELSE iF(@Trans_type = 'subscr_cancel') 
    begin 
    set @tmpType = 'basic' 
    END 
+0

To wygrało Jeśli tak, to inaczej. – RichardOD

+0

Trochę dziwnego komentarza, który pojawia się tak długo po ujawnieniu prawdziwej odpowiedzi. ;-) – Munklefish

0

Just a wskazówka dla tego, nie trzeba początek i koniec, jeśli zawiera tylko jedno oświadczenie.

tj:

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

Spróbuj tego z SQL JOIN

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 
Powiązane problemy