2013-04-07 83 views
0

我遇到的问题是创建一个名为prc_cus_balance_update的过程,该过程将发票号码作为参数并更新客户余额(提示您可以使用declare节来定义一个totinv数字变量,计算出的发票总额)无法创建存储过程

到目前为止,我有

ALTER PROCEDURE [dbo].[PRC_CUS_BALANCE_UPDATE] 
    (@INVID INT) 
AS 
    DECLARE @INVTOT INT 
    DECLARE @CUSID INT 

    BEGIN 
    SET NOCOUNT ON; 

    SELECT CUS_CODE INTO CUSID 
    FROM INVOICE 
    WHERE INVOICE.INV_NUMBER = @INVID 

    IF CUSID > 0 
     UPDATE CUSTOMER 
     SET CUS_BALANCE = CUS_BALANCE + 
          (SELECT INV_TOTAL 
          FROM INVOICE 
          WHERE INV_NUMBER = INVID) 
     WHERE CUS_CODE = CUSID 
    END IF 
    END 

但每一次我尝试编译它,它给了我近关键字END不正确的语法。我在网上发现了类似的帖子,但我总是以相同的错误结束。

+2

你使用了什么数据库引擎? (SQL Server,MySql等) – Kai 2013-04-07 19:35:59

+0

sql服务器,对不起应该包括那个 – user2201268 2013-04-07 19:54:42

回答

4

在Transact-SQL,你的SP似乎要写入的IF语法是这样的:

IF Boolean_expression 
    { sql_statement | statement_block } 
[ ELSE 
    { sql_statement | statement_block } ] 

正如你所看到的,没有收END IF。所以,一个简单的办法就是去掉END IF,在这种情况下,您IF声明将是简单地

IF CUSID > 0 
    UPDATE CUSTOMER 
    SET CUS_BALANCE = CUS_BALANCE + 
     (SELECT INV_TOTAL 
     FROM INVOICE 
     WHERE INV_NUMBER = INVID) 
    WHERE CUS_CODE = CUSID 
; 

如果你希望你的IF语句来结束与END,附上身体成BEGIN…END块:

IF CUSID > 0 
BEGIN 
    UPDATE CUSTOMER 
    SET CUS_BALANCE = CUS_BALANCE + 
     (SELECT INV_TOTAL 
     FROM INVOICE 
     WHERE INV_NUMBER = INVID) 
    WHERE CUS_CODE = CUSID; 
END; 

还有其他问题。看起来对变量@CUSID@INVTOT的一些引用不是以@字符开始的。另外,您似乎正在使用SELECT INTO为变量赋值。 (你转换从MySQL这个SP?)

为了解决这些问题:

  1. 在Transact-SQL,变量名总是以@字符开始,无论是在声明或引用。

  2. 的值赋给一个变量,请使用以下语法:

    SELECT @varname = ... 
    [ FROM ... 
    WHERE ... ] 
    

    所以,在你的情况下,SELECT语句可能应该是这样的:

    SELECT @CUSID = CUS_CODE 
    FROM INVOICE 
    WHERE INVOICE.INV_NUMBER = @INVID 
    
1

也许一些其他问题以及:

CREATE PROCEDURE [dbo].[PRC_CUS_BALANCE_UPDATE] --<<<<use CREATE to create ! 
    (@INVID INT) 
AS 
    DECLARE @INVTOT INT --<<<<<<what is the point of this variable as it is not used? 
    DECLARE @CUSID INT 

    BEGIN 
    SET NOCOUNT ON; 

    /*<<<<if the following is only testing for the existence within INVOICE table then<<< 
    SELECT CUS_CODE 
    INTO CUSID 
    FROM INVOICE 
    WHERE INVOICE.INV_NUMBER = @INVID 

    IF CUSID > 0 
    <<<<replace with following<<<<<*/ 
    IF EXISTS (SELECT 1 FROM INVOICE WHERE INVOICE.INV_NUMBER = @INVID) 

     BEGIN --<<<<<as already mentioned 
     UPDATE CUSTOMER 
     SET CUS_BALANCE = CUS_BALANCE + 
          (SELECT INV_TOTAL 
          FROM INVOICE 
          WHERE INV_NUMBER = INVID) --<<<is this supposed to be [email protected] ? 
     WHERE CUS_CODE = CUSID --<<<this looks odd as it seems you are trying to say "CUS_CODE = <some table created earlier>" ? 
     END; --<<<<<as already mentioned 
    END IF 
    END 
+0

感谢您的回答,让我仔细看看其余的SP。 SELECT语句可能是需要的,请参阅我的更新。 – 2013-04-07 22:28:52

+0

如果你创建一个名为'CUSID'的_table_,然后再尝试'WHERE CUS_CODE = CUSID',那么我相信它会抛出一个错误 – whytheq 2013-04-07 22:33:18

+0

我的观点是SELECT INTO语法的意思是别的。所有存在的问题('END IF',看似不必要的'SELECT INTO name',奇怪的条件)向我暗示这最初是一个MySQL过程。 – 2013-04-07 22:37:25