每个第三人获奖的程序

时间:2016-04-20 06:40:39

标签: sql-server tsql stored-procedures

我正在处理一个存储过程,该程序应奖励每个第三人,并在当前信用额度上获得额外奖励。奖金金额和(第三人称)选项应参数化。其中有一个是我当前的代码,但是当我尝试用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

3 个答案:

答案 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 ASCknr不存在。

您还使用未声明的变量@custnr