2009-11-06 2 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 должен быть другим, если (у вас в настоящее время есть логическое выражение в вашем другом, что не имеет смысла). Вот то, что она должна быть

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

+0

Рад, что это отсортировано сейчас. – RichardOD

+0

@Munklefish эй, но я рад, что вы сделали это (не то, что я злой, но ..), потому что это помогло мне с одним основным вопросом, который я думал о SQL: P –

8

Этого не стоит никаких ошибок. Попробуйте
SET @tmpType = 'premium '
и
SET @tmpType = 'basic'

+0

Я просто попытался что и он возвращает следующую ошибку бесполезные Неправильный синтаксис около '@Trans_type'. – Munklefish

+0

Это определенно часть проблемы – RichardOD

+0

У моего ответа есть следующее исправление. :-) – RichardOD

1

попробовать

set @tmptype 
+0

Я просто попытался что и он возвращает следующую ошибку бесполезных «Неправильный синтаксис около„@Trans_type“» – Munklefish

3

Вы не нашли в 'SET' о при назначении ваших переменных в IF .. ELSE блок?

+0

Я просто попытался что и он возвращает следующую ошибку бесполезных «Неправильный синтаксис около" @Trans_type» – Munklefish

1

Да Ник прав.

Вы должны использовать SET или SELECT назначить @tmpType

+0

Я просто попробовал это, и он возвращает следующую бесполезную ошибку. «Неверный синтаксис рядом с« @Trans_type » – Munklefish

+0

См. Мой ответ для следующего исправления ... – RichardOD

-1

попробовать

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

Это выиграло Не работайте. Else должно быть иначе, если. – RichardOD

+0

бит нечетного комментария, пришедшего так долго после того, как был обнаружен реальный ответ. ;-) – Munklefish

0

Просто наконечник для этого, вам не нужно начинать и заканчивать, если он содержит только один оператор.

т.е.

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