2011-03-30 60 views
1

這可能是一個愚蠢的語法錯誤,但我只是繼續閱讀我的程序,但我無法弄清楚我的錯誤在哪裏。SQL Server上的語法錯誤

消息156,級別15,狀態1,行 'FOR' 關鍵字 近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 

有人可以幫助我嗎?

+0

什麼是在第41行? – 2011-03-30 19:25:08

+0

這是我爲此方法聲明創意 – Dimitri 2011-03-30 19:26:03

回答

11

請勿在光標名稱中使用@符號。

+0

感謝您的回覆。有用 – Dimitri 2011-03-30 19:28:00

3

擺脫遊標 - 使用基於集合的解決方案。

基本上你這樣做是:

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 
) 

,可隨時更換用的存在是爲了處理插入更快。

更好的是,做INNER JOIN可能是最好的表現。

+1

+1的線。不知道它是否適合這種特殊情況,但迪米特里可以證實。無論如何,最好的辦法是儘可能避免遊標以獲得最佳性能。缺點是調試比較困難... – Adi 2011-03-30 19:38:46

1

名稱光標creservation代替@creservation

1

刪除光標名前@符號在DECLARE @cstock CURSOR聲明