-2

私は次のように書いていますstored procedureが、エラーが発生します。ありがとう。

/* stored procedure interestcalc writen by M */
SET ANSI_NULLS ON

SET QUOTED_IDENTIFIER ON

CREATE PROCEDURE spInterestCal
 (
    @P_NO  INT,
    @TOTAL_MONEY   INT,
    @PAYMENT_TYPE  INT,  /* if payment type is 1 then Yearly, 2 then Semi Yearly, 3 then Quaterly, 4 then Montly  */
    @INTEREST_RATE  INT,
    @START_DATE  DATE,
    @END_DATE  DATE,
  )
AS 
BEGIN

    DECLARE @INSTALLMENT_FACTOR FLOAT 
    DECLARE @INSTALLMENT_NUMBER INT
    DECLARE @INTEREST FLOAT 
    DECLARE @I INT
    DECLARE @R_INSTALLMENT_NUMBER INT
    SET @INSTALLMENT_FACTOR = 0
    SET @INSTALLMENT_NUMBER = 0
    SET @INTEREST = 0
    SET @I = 1
    SET @R_INSTALLMENT_NUMBER = 0

    /*
    DECLARE @YEARS_DIFF INT
    DECLARE @MONTHS_DIFF INT
    DECLARE @DAYS_DIFF INT
    SET @YEARS_DIFF = DATEDIFF(YYYY,@START_DATE,@END_DATE)
    SET @MONTHS_DIFF = DATEDIFF(M,@START_DATE,@END_DATE)-(datediff(YYYY,@START_DATE,@END_DATE)*12)
    SET @DAYS_DIFF = DATEPART(D,@END_DATE)-DATEPART(D,@START_DATE) 
    */

    IF (@PAYMENT_TYPE = 1)  /* if PaymentType is 1 means Yearly */
       BEGIN 
            SELECT @INSTALLMENT_FACTOR = 1;
            SELECT @INSTALLMENT_NUMBER = 1; /*Yearly So 1 INSTALLMENT */
       END

    IF (@PAYMENT_TYPE = 2)  /* if PaymentType is 2 means Semi Yearly */
       BEGIN
            SELECT @INSTALLMENT_FACTOR = 0.5;
            SELECT @INSTALLMENT_NUMBER = 2; /*Semi Yearly So 2 INSTALLMENT */
       END

    IF (@PAYMENT_TYPE = 3)  /* if PaymentType is 3 means Quaterly */
       BEGIN
            SELECT @INSTALLMENT_FACTOR = 0.25;
            SELECT @INSTALLMENT_NUMBER = 4; /*Quaterly So 4 INSTALLMENT */
       END
    IF (@PAYMENT_TYPE = 4)   /* if PaymentType is 4 means Montly  */
       BEGIN 
            SELECT @INSTALLMENT_FACTOR = 0.08;
            SELECT @INSTALLMENT_NUMBER = 12;  /*Montly So 12 INSTALLMENT */
       END 

    SELECT @R_INSTALLMENT_NUMBER = ((SELECT DATEDIFF(YEAR, @START_DATE, @END_DATE))* @INSTALLMENT_NUMBER)
    DECLARE @SMOUNT INT
    DECLARE @SYEAR INT
    SELECT @SMOUNT = (SELECT MONTH(@START_DATE))
    SELECT @SYEAR =  (SELECT YEAR(@START_DATE))

    WHILE ((SELECT @I) < = @R_INSTALLMENT_NUMBER )  /* Calculates Interest And Prints Info*/
        BEGIN
             IF (@SMOUNT > 12)
                BEGIN
                    SELECT @SYEAR +1
                END
            SELECT @R_INSTALLMENT_NUMBER = @R_INSTALLMENT_NUMBER -1
            SELECT @INTEREST = ((SELECT @TOTAL_MONEY) - (SELECT @R_INSTALLMENT_NUMBER * (SELECT @INSTALLMENT_FACTOR*(SELECT @TOTAL_MONEY)))) * ((SELECT @INTEREST_RATE)/100 ) 
            PRINT '  P_NO IS   ' + @P_NO + '  TOTAL_MONEY IS   ' + @TOTAL_MONEY + '  INSTALLMET AMOUNT IS   ' + @TOTAL_MONEY/@R_INSTALLMENT_NUMBER +  ' @INTEREST IS  '+ @INTEREST  + ' DUE DATE IS  '+ (SELECT DAY(@START_DATE))  + '/' + (@SMOUNT) + '/' +(@SYEAR) 
            SELECT @SMOUNT = @SMOUNT + @INSTALLMENT_NUMBER-1

        END    

END
GO
4

2 に答える 2

1

クエリの解析中に 4 つのエラーが発生したようです。SQL Server Management Studio で自分で解析してみると、次のように表示されます。

Msg 102, Level 15, State 1, Procedure spInterestCal, Line 13
Incorrect syntax near ')'.

Msg 111, Level 15, State 1, Procedure spInterestCal, Line 18
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.

Msg 1046, Level 15, State 1, Procedure spInterestCal, Line 74
Subqueries are not allowed in this context. Only scalar expressions are allowed.

Msg 102, Level 15, State 1, Procedure spInterestCal, Line 79
Incorrect syntax near 'GO'.

上記の問題を最初に修正しないと検出できない論理エラーもいくつかあるようです。

最初の解析エラーを修正するには、パラメーター リストの末尾から誤ったコンマを削除するだけです (削除されたコンマに注意してください)。

@END_DATE  DATE

2 番目のエラーも単純明快で、GOの後SET QUOTED_IDENTIFIER ONと の前に置かれCREATE PROCEDUREます。

SET QUOTED_IDENTIFIER ON
GO

次は、次のPRINTステートメントを含むステートメントに関するものです。SELECT DAY(@START_DATE)これは許可されていないため、削除する必要があります。

DAY(@START_DATE)

END GO手順の最後に1行あるため、最後の1つが発生しています。試す:

END
GO
于 2013-03-28T09:03:31.040 に答える
1

2 つの構文エラーが表示されます。

1) ')' 付近の構文が正しくありません。最後のパラメーターの後のコンマを削除します。@END_DATE

2)このコンテキストではサブクエリは許可されません。スカラー式のみが許可されています

PRINT '  P_NO IS   ' + @P_NO + '  TOTAL_MONEY IS   ' + @TOTAL_MONEY + '  
   INSTALLMET AMOUNT IS   ' + @TOTAL_MONEY/@R_INSTALLMENT_NUMBER +  ' @INTEREST IS  '+ 
   @INTEREST  + ' DUE DATE IS  '+ 
   (SELECT DAY(@START_DATE))  + '/' + (@SMOUNT) + '/' +(@SYEAR)

SELECTから取り外し(SELECT DAY(@START_DATE))て持つだけ' DUE DATE IS '+DAY(@START_DATE) + '/'

于 2013-03-28T09:04:10.617 に答える