誰でもこのストアドプロシージャで間違っていることを指摘してください。私はそれをコンパイルすることができず、私のソフトウェアは何が間違っているのかについて有用な手がかりを与えていません。
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
ニックは正しい。次のエラーはelse ifがelse ifである必要があることです(現在、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を使ったことがありません!
エラーは発生していませんか?試してSET @tmpType = 'premium
'
そしてSET @tmpType = 'basic'
IF .. ELSEブロックで変数に割り当てるときに「SET」ステートメントが欠落していますか?
試してみる
set @tmptype
ええ、ニックは正しい。
@tmpTypeに割り当てるには、SET
またはSELECT
を使用する必要があります
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
このためのヒントとして、単一のステートメントのみが含まれている場合は、BEGINとENDは必要ありません。
すなわち:
IF(@Trans_type = 'subscr_signup')
set @tmpType = 'premium'
ELSE iF(@Trans_type = 'subscr_cancel')
set @tmpType = 'basic'