this could be a stupid syntax error but I just keep reading my procedure but i cannot figure out where are my errors.
Msg 156, Level 15, State 1, Line 41
Incorrect syntax near the keyword 'FOR'.
Here is my code :
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
i开发者_如何学Cnsert 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
Can somebody help me ?
Don't use the @ symbol in your cursor names.
Get rid of the cursor - use a set based solution.
Basically you are doing this:
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
)
You can replace the IN with an exists to process the insert faster.
Better still, do INNER JOIN
for possibly the best performance.
Name your cursor creservation instead of @creservation
Drop the @
symbol before your cursor name in the DECLARE @cstock CURSOR
statement
精彩评论