Синтаксическая ошибка на SQL Server - PullRequest
2 голосов
/ 30 марта 2011

это может быть глупой синтаксической ошибкой, но я просто продолжаю читать свою процедуру, но не могу понять, где мои ошибки.

Сообщение 156, Уровень 15, Состояние 1, Строка 41
Неверный синтаксис рядом с ключевым словом 'ЗА'.

Вот мой код:

alter procedure LockReservation as
DECLARE @edition_id tinyint, @stockid  tinyint;
DECLARE @creservation CURSOR FOR select edition_id from reservation where (date_fin - GETUTCDATE()) <= 12;
open creservation;
while @@fetch_status = 0
BEGIN
    fetch creservation into @edition_id;
    DECLARE @cstock CURSOR 
        FOR select id from stock where edition_id = @edition_id;
    open cstock;
    while @@fetch_status = 0
    BEGIN
        fetch cstock into @stockid;
        select stock_id from location where location.stock_id = @stockid and archivage = 0
        if @@rowcount = 0
        BEGIN
             insert into stocks_reserves(id, date_ajout, usure, suppression, edition_id) 
                    Select id, date_ajout, usure, suppression, edition_id 
                from stock 
                where stock.id = @stockid
        END
    END
    CLOSE cstock
    DEALLOCATE cstock
END
CLOSE creservation
DEALLOCATE creservation

Может ли кто-нибудь мне помочь?

Ответы [ 4 ]

13 голосов
/ 30 марта 2011

Не используйте символ @ в именах курсоров.

3 голосов
/ 30 марта 2011

Избавьтесь от курсора - используйте решение на основе множеств.

В основном вы делаете это:

insert into stocks_reserves
(id, date_ajout, usure, suppression, edition_id) 
Select id, date_ajout, usure, suppression, edition_id 
from stock 
where stock.id in
(
    select stock_id 
    from location 
    where location.stock_id in
    (
        select id 
        from stock 
        where edition_id in
        (
            select edition_id 
            from reservation 
            where (date_fin - GETUTCDATE()) <= 12
        )
    )
    and archivage = 0
)

Вы можете заменить IN на существующее для более быстрой обработки вставки.

Еще лучше, сделайте INNER JOIN для наилучшей производительности.

1 голос
/ 30 марта 2011

Перетащите символ @ перед именем курсора в инструкции DECLARE @cstock CURSOR

1 голос
/ 30 марта 2011

Назовите свое сохранение курсора вместо @creservation

...