2013-04-07 4 views
0

Проблема заключается в создании процедуры с именем prc_cus_balance_update, которая будет принимать номер счета в качестве параметра и обновлять баланс клиента (подсказка, которую вы можете использовать в разделе объявления, чтобы определить переменную числа 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

+0

sql server, извините, должен был включить, что – user2201268

ответ

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?)

Для решения этих проблем:

  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, пожалуйста, просмотрите мое обновление. –

+0

Если вы создаете _table_, называемый 'CUSID', а затем попытаетесь сделать' WHERE CUS_CODE = CUSID', тогда я верю, что он вызовет ошибку. – whytheq

+0

. Мое мнение состояло в том, что синтаксис SELECT INTO имел в виду что-то еще. Все проблемы, которые есть ('END IF', кажущиеся ненужными' SELECT INTO name ', нечетные условия), предлагают мне, что это изначально была процедурой MySQL. –

Смежные вопросы