2009-11-06 61 views
13

任何人都可以请指出我在做什么这个存储过程错了请。我无法得到它编译和我的软件没有提供任何有用的线索,它有什么问题。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 

回答

15

尼克是正确的。下一个错误是其他应该是别人如果(你目前有一个布尔表达式在你的其他没有意义)。下面是它应该是什么

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

您目前有以下(这是错误的):

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

下面是对错误和SQL Server Management Studio中的未来 - 双击会去小费到错误所在的行。如果你认为SQL Server给出了神秘的错误(我认为它不是),那么你还没有和Oracle合作过!

+0

优秀的感谢。愚蠢的错误,使。 ;-( – Munklefish 2009-11-06 14:45:32

+0

高兴它现在可以正确排序 – RichardOD 2009-11-06 14:47:20

+0

@Munklefish哎,但是我很高兴你来了(不是我邪恶的,但..)引起帮我一个基本的问题,我想到了SQL:P。 – 2016-01-26 13:50:29

8

它没有给出任何错误? 尝试
SET @tmpType = 'premium'

SET @tmpType = 'basic'

+0

我只是去尝试,它返回以下无益错误 附近有语法错误@Trans_type“。 – Munklefish 2009-11-06 14:39:50

+0

这绝对是问题的一部分 – RichardOD 2009-11-06 14:41:29

+0

我的答案有下一个修正。 :-) – RichardOD 2009-11-06 14:42:51

1

尝试

set @tmptype 
+0

我只是去尝试,它返回以下无益错误 “近‘@Trans_type’不正确的语法” – Munklefish 2009-11-06 14:41:06

3

你缺少 '在IF分配给您的变量时.. ELSE块集' 语句?

+0

我只是去尝试,它返回以下无益错误 “附近有语法错误@Trans_type'” – Munklefish 2009-11-06 14:41:42

1

是的尼克是正确的。

您需要使用SETSELECT分配给@tmpType

+0

我只是去尝试,它返回以下无益错误 “附近有语法错误@Trans_type'” – Munklefish 2009-11-06 14:40:34

+0

见我的回答下一个修复... – RichardOD 2009-11-06 14:44:51

-1

尝试

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

那赢没有工作,否则,如果。 – RichardOD 2009-11-06 14:47:57

+0

真正的答案已被揭示后,很长一段奇怪的评论来了。 ;-) – Munklefish 2009-11-06 14:50:21

0

只是一个提示这一点,你不需要BEGIN和END如果只包含一个语句。

即:

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

与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