Получение ошибок 'Должен объявить скалярную переменную' при запуске хранимой процедуры - PullRequest
0 голосов
/ 06 марта 2012
USE db_preprac_v1_2
GO

CREATE PROCEDURE sp_accessory
@repID AS SMALLINT
AS

- Создать временную копию таблицы

    SELECT * 
    INTO #tempAcc
    FROM accessory 
    GO

- добавить столбец с именем Printed

    ALTER TABLE #tempAcc
    ADD
    Printed SMALLINT
    GO

- установить все значения в этом столбце равными 0

    UPDATE #tempAcc
    SET Printed = 0
    GO


    --Declare variables

    DECLARE @RepName AS VARCHAR(30)
    DECLARE @RepTel AS VARCHAR(10)
    DECLARE @AccID AS SMALLINT
    DECLARE @AccDesc AS VARCHAR(30)
    DECLARE @AccPrice AS MONEY
    DECLARE @Quantity AS SMALLINT
    DECLARE @total AS MONEY = 0
    --DECLARE @ID AS SMALLINT = @repID

/ * Проверяет, является ли действительным идентификатор представителя, и если он действителен, он отображает все аксессуары что представитель продал. Если он недействителен, выводится сообщение об ошибке * /

IF NOT EXISTS(SELECT rep_id FROM representative WHERE rep_id = @repID)
>BEGIN
    PRINT 'Invalid representative id'
END
ELSE
BEGIN
    SELECT @RepName = representative.rep_name, @RepTel = representative.rep_tel
    FROM representative
    WHERE @repID = representative.rep_id

    PRINT '************************'
    PRINT 'Accessory Details Report'
    PRINT '************************'
    PRINT ''
    PRINT 'Representative Information'
    PRINT ''
    PRINT 'Reps Name: ' + @RepName
    PRINT 'Reps Telephone: ' + @RepTel
    PRINT ''

    PRINT 'Accessories Sold by this Representative'

- Создает цикл while для итерации по строкам

WHILE EXISTS (SELECT *
  FROM #tempAcc
  WHERE Printed = 0) 

  BEGIN 
    SELECT @AccID = MIN (acc_id)
    FROM #tempAcc
    WHERE Printed = 0

    SELECT @AccDesc = accessory.acc_desc, @AccPrice = accessory.acc_price, @Quantity = accessory_detail.quantity
    FROM accessory
    JOIN accessory_detail
    ON accessory.acc_id = accessory_detail.acc
    JOIN representative
    ON accessory_detail.rep = representative.rep_id
    WHERE @repID = representative.rep_id

    PRINT 'Accessory Desc: ' + @AccDesc
    PRINT 'Accessory Price: ' + CAST(@AccPrice AS VARCHAR)
    PRINT 'Quantity in Car: ' + CAST(@Quantity AS VARCHAR)
    PRINT ''

    UPDATE #tempAcc
       SET Printed = 1
       WHERE @AccID = acc_id

- Расчет общей стоимости проданных аксессуаров

    SELECT @total = @total + @AccPrice
  END
END

    PRINT 'The total value of the accessories sold is: ' + CAST(@total AS VARCHAR)
    PRINT 'Transaction Date: ' + CAST(GETDATE() AS VARCHAR)     

GO

- для выполнения процедуры введите входное значение представительского идентификатора.

EXEC sp_accessory 3
GO

DROP PROCEDURE sp_accessory
GO

Это то, что я получаю, когда выполняю код с помощью Microsoft SQL Server Management Studio:

Msg 137, Level 15, State 2, Line 15
Must declare the scalar variable "@repID".
Msg 156, Level 15, State 1, Line 19
Incorrect syntax near the keyword 'ELSE'.
Msg 137, Level 15, State 2, Line 23
Must declare the scalar variable "@repID".
Msg 137, Level 15, State 2, Line 53
Must declare the scalar variable "@repID".

--------------------------------------------------------------------------**

1 Ответ

2 голосов
/ 06 марта 2012

1) Не называйте никакую процедуру "sp_ (ANYTHING)";«sp_» следует использовать для системных хранимых процедур.

2) У вас есть три GO оператора в середине вашей процедуры.Если вы запустите это как CREATE скрипт, он будет предполагать, что первый GO отмечает конец скрипта.

3) У вас есть шальные> до вашего BEGIN после вашего IF.

4) Почему вы отбрасываете процедуру после ее выполнения?

5) Вы не умножаете количество на цену, чтобы получить промежуточный итог для каждой строки.Таким образом, общая сумма неверна.Измените это:

SELECT @total = @total + @AccPrice

на это:

SELECT @total = @total + (@Quantity * @AccPrice)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...