2013-03-28 101 views
-2

我寫了以下stored procedure,但它給出了錯誤,我如何使它正常工作。謝謝。存儲過程SQL服務器

/* 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 
+2

什麼是'error'你得到? – praveen 2013-03-28 08:57:08

+0

最新錯誤? – 2013-03-28 08:57:32

+1

刪除最後一個參數後的逗號:'@ end_date' – codingbiz 2013-03-28 09:01:00

回答

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 

第二個錯誤也直線前進,把GOSET QUOTED_IDENTIFIER ON和前CREATE PROCEDURE

SET QUOTED_IDENTIFIER ON 
GO 

PRINT聲明,其中包含一個SELECT DAY(@START_DATE)聲明接下來的關注 - 這是不允許的,應該b E法除去:

DAY(@START_DATE) 

最後一個發生,因爲你必須在你的程序結束END GO在一行。嘗試:

END 
GO 
+0

感謝馬丁的信息 – 2013-03-28 10:00:59

+0

順便說一句,我修復了程序後,我把它放在SQL導航器(我有5.5版本)它會給出錯誤,但不會給微軟SQL服務器的錯誤。爲什麼?謝謝 – 2013-03-28 10:26:57

+0

當我嘗試執行此過程時,它給出錯誤spInterestCal P_NO = 999,TOTAL_MONEY = 400,PAYMENT_TYPE = 3,INTEREST_RATE = 10,START_DATE ='2012-3-10',END_DATE ='2014-5-12'ps:因爲我不能用@符號發送註釋我刪除了每個參數前面的@符號 – 2013-03-28 10:43:37

1

我看到兩個語法錯誤:

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 DAY(@START_DATE))SELECT只有具備' DUE DATE IS '+DAY(@START_DATE) + '/'

+0

when我嘗試執行這個過程,它給出錯誤spInterestCal P_NO = 999,TOTAL_MONEY = 400,PAYMENT_TYPE = 3,INTEREST_RATE = 10,START_DATE ='2012-3-10',END_DATE ='2014-5-12'ps:因爲我不能't用@符號發送了評論我刪除了每個參數前面的@符號 - – 2013-03-28 10:44:16

+0

錯誤是:當將varchar值'POLICY_NO IS'轉換爲數據時,Msg 245,Level 16,State 1,過程spInterestCal,Line 70轉換失敗鍵入int – 2013-03-28 10:44:43