2011-03-30 4 views
1

이것은 바보 같은 구문 오류 일 수 있지만 계속 프로 시저를 읽지 만 내 오류가 어디에 있는지 알 수 없습니다.SQL 서버의 구문 오류

메시지 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 

누군가가 나를 도울 수 있습니다 : 여기

내 코드?

+0

에서 커서 이름 앞에 @ 심볼의 커서의 creservation? –

+0

이 접근법에 대해 저축을 선언하는 행은 – Dimitri

답변

11

커서 이름에 @ 기호를 사용하지 마십시오.

+0

답장을 보내 주셔서 감사합니다. 그것은 작동합니다. – Dimitri

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 
) 

당신은 IN을 교체 할 수 있습니다.

더 나은 성능을 위해 아마도 INNER JOIN을 수행하십시오.

+1

+1입니다. 이 특별한 경우에 실제로 작동하는지 모르겠지만 Dimitri는 확인할 수 있습니다. 어쨌든 최상의 방법은 최상의 성능을 위해 가능한 한 커서를 피하는 것입니다. 단점은 디버깅이 더 어렵다는 것입니다 ... – Adi

1

이름 대신 @creservation

1

드롭 라인 (41)에 있습니다 무엇 DECLARE @cstock CURSOR