我正在处理一个存储过程,该程序应奖励每个第三人,并在当前信用额度上获得额外奖励。奖金金额和(第三人称)选项应参数化。其中有一个是我当前的代码,但是当我尝试用SQLFiddle执行它时,我总是得到错误Incorrect syntax near 'INTEGER'.
- 但我无法在代码中找出错误。我正在使用MS SQL Server 2014.
CREATE TABLE Customer (
custnr INTEGER PRIMARY KEY IDENTITY,
name VARCHAR(40) NOT NULL,
firstname VARCHAR(40) NOT NULL,
credit DECIMAL(12,2)
);
CREATE PROCEDURE awardBonus
@position INTEGER;
@bonus DECIMAL(5,2)
AS
BEGIN
DECLARE @creditCustomer DECIMAL(12,2);
DECLARE customer_cursor CURSOR FOR
SELECT custnr
FROM Customer
ORDER BY custnr ASC;
OPEN customer_cursor;
FETCH NEXT FROM customer_cursor INTO @custnr;
WHILE @@FETCH_STATUS = 0
BEGIN
IF (@custnr % @position = 0)
BEGIN
SELECT @creditCustomer = credit
FROM Customer
WHERE custnr = @custnr;
SET @creditCustomer = @creditCustomer + @bonus;
UPDATE Customer
SET credit = @creditCustomer
WHERE custnr = @custnr;
END;
FETCH NEXT FROM customer_cursor INTO @custnr;
END;
CLOSE customer_cursor;
DEALLOCATE customer_cursor;
END;
EXECUTE awardBonus 3, 100
答案 0 :(得分:3)
您需要删除参数列表中的;
:
@position INTEGER;
此外,您应首先声明@custnr
:
DECLARE @custnr INT;
您的ORDER BY
子句中也存在无效的列名错误:
ORDER BY knr ASC;
应该是:
ORDER BY custnr ASC;
您可以以基于集合的方式重写此内容并删除CURSOR
CREATE PROCEDURE awardBonus
@position INTEGER,
@bonus DECIMAL(5,2)
AS
BEGIN
WITH Cte AS(
SELECT *,
rn = ROW_NUMBER() OVER(ORDER BY custnr)
FROM Customer
)
UPDATE Cte
SET credit = credit + @bonus
WHERE
rn % @position = 0
END
答案 1 :(得分:2)
CREATE PROCEDURE awardBonus
@position INTEGER;
@bonus DECIMAL(5,2)
整数之后有一个分号应该是逗号
更正后的版本
CREATE PROCEDURE awardBonus
@position INTEGER,
@bonus DECIMAL(5,2)
另一方面,如果这是随机选择还是订购,您如何选择第三人?为什么你使用Cursor,基于集合的解决方案似乎是一个更好的选择。在随机或非随机情况下,您可以使用ROW_NUMBER()构造查询,例如选择第3条记录。
答案 2 :(得分:0)
您需要一个;
,
:
CREATE PROCEDURE awardBonus
@position INTEGER;
@bonus DECIMAL(5,2)
此外,CREATE PROCEDURE
必须是批处理中唯一的语句。因此,您必须在单独的批处理中创建表。
此外,您使用ORDER BY knr ASC
,knr
不存在。
您还使用未声明的变量@custnr
。