2009-11-06 33 views
13

¿Puede alguien señalar qué estoy haciendo mal con este procedimiento almacenado por favor? No puedo compilarlo y mi software no da pistas útiles sobre lo que está mal.IF/ELSE Procedimiento almacenado

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 

Respuesta

15

Nick es correcto. El siguiente error es el else else else if (actualmente tiene una expresión booleana en su else que no tiene sentido). Aquí es lo que debería ser

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

Actualmente tienes el siguiente (que es malo):

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

He aquí un consejo para el futuro- haga doble clic en el error y SQL Server Management Studio irá a la línea donde reside el error Si cree que SQL Server proporciona errores crípticos (que no creo que ocurra), ¡entonces no ha trabajado con Oracle!

+0

Excelente gracias. Error tonto de hacer. ;-( – Munklefish

+0

Me alegro de que está ordenado ahora. – RichardOD

+0

@Munklefish oye, pero me alegro de que lo hiciste (no es que sea malo, pero ...) porque esto me ayudó con una pregunta básica que pensé sobre SQL: P –

8

¿No está dando ningún error? Trate
SET @tmpType = 'premium '
y
SET @tmpType = 'basic'

+0

he intentado eso y se devuelve el siguiente error inútil sintaxis incorrecta cerca de '@Trans_type'. – Munklefish

+0

Eso es definitivamente parte del problema – RichardOD

+0

Mi respuesta tiene la siguiente solución. :-) – RichardOD

1

tratar

set @tmptype 
+0

he intentado eso y devuelve el siguiente error inútil "sintaxis incorrecta cerca de '@Trans_type'" – Munklefish

3

¿Le falta la 'instrucción SET' al asignar a las variables en el bloque SI .. ELSE?

+0

he intentado eso y se devuelve el siguiente error inútil "sintaxis incorrecta cerca de '@Trans_type'" – Munklefish

1

sí, Nick tiene razón.

Es necesario utilizar SET o SELECT asignar a @tmpType

+0

Acabo de intentarlo y devuelve el siguiente error inútil "Sintaxis incorrecta cerca de '@Trans_type'" – Munklefish

+0

Ver mi respuesta para la próxima solución ... – RichardOD

-1

tratar

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

que ganó no funciona. Else necesita ser otra cosa si. – RichardOD

+0

poco de un comentario extraño que viene tanto tiempo después de que la respuesta real ha sido revelada. ;-) – Munklefish

0

Sólo un consejo para esto, que no es necesario el comenzar y terminar si sólo contiene una única instrucción.

es decir:

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

probar esto con 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 
Cuestiones relacionadas