Quelqu'un peut-il s'il vous plaît indiquer ce qui ne va pas avec cette procédure stockée s'il vous plaît. Je ne parviens pas à le compiler et mon logiciel ne donne pas d’indices utiles sur son problème.
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
Nick a raison. La prochaine erreur est le else devrait être else if (vous avez actuellement une expression booléenne dans votre else qui n'a aucun sens). Voici ce qu'il devrait être
ELSE IF(@Trans_type = 'subscr_cancel')
BEGIN
SET @tmpType = 'basic'
END
Vous avez actuellement les éléments suivants (ce qui est faux):
ELSE(@Trans_type = 'subscr_cancel')
BEGIN
SET @tmpType = 'basic'
END
Voici un conseil pour l’avenir. Double-cliquez sur l’erreur et SQL Server Management Studio ira à la ligne où se trouve l’erreur. Si vous pensez que SQL Server génère des erreurs cryptiques (ce qui, à mon avis, n’est pas le cas), vous n’avez pas travaillé avec Oracle!
Cela ne donne aucune erreur? EssayezSET @tmpType = 'premium
'
etSET @tmpType = 'basic'
L'instruction 'SET' vous manque-t-elle lorsque vous affectez vos variables dans le bloc IF .. ELSE?
essayer
set @tmptype
ouais Nick a raison.
Vous devez utiliser SET
ou SELECT
pour affecter à @tmpType
Essayez ceci avec les instructions de jointure 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
Juste un conseil pour cela, vous n'avez pas besoin de BEGIN et END si elle ne contient qu'une seule déclaration.
c'est à dire:
IF(@Trans_type = 'subscr_signup')
set @tmpType = 'premium'
ELSE iF(@Trans_type = 'subscr_cancel')
set @tmpType = 'basic'