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
Ответы
Ответ 1
Ник прав. Следующая ошибка заключается в том, что 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!
Ответ 2
Это не дает никаких ошибок?
Попробуйте
SET @tmpType = 'premium
'
и
SET @tmpType = 'basic'
Ответ 3
Вам не хватает инструкции "SET" при назначении вашим переменным в блоке IF.. ELSE?
Ответ 4
попробуйте
set @tmptype
Ответ 5
Да, Ник прав.
Вам нужно использовать SET
или SELECT
для назначения @tmpType
Ответ 6
Просто совет для этого, вам не нужны BEGIN и END, если он содержит только один оператор.
т
IF(@Trans_type = 'subscr_signup')
set @tmpType = 'premium'
ELSE iF(@Trans_type = 'subscr_cancel')
set @tmpType = 'basic'
Ответ 7
Попробуйте это с помощью операторов 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
Ответ 8
попробовать
IF(@Trans_type = 'subscr_signup')
BEGIN
set @tmpType = 'premium'
END
ELSE iF(@Trans_type = 'subscr_cancel')
begin
set @tmpType = 'basic'
END