2009-11-06 50 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