这可能是一个愚蠢的语法错误,但我只是继续阅读我的过程,但我不知道我的错误在哪里。
Msg 156,15级,状态1,41号线
关键字“FOR”附近的语法不正确。
这是我的代码:
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
有人能帮我吗?
发布于 2011-03-30 11:26:30
不要在光标名称中使用@符号。
发布于 2011-03-30 11:24:47
去掉光标--使用基于集合的解决方案。
基本上你是这样做的:
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
以获得最好的性能。
发布于 2011-03-30 11:28:00
命名您的游标保留而不是@保留
https://stackoverflow.com/questions/5491181
复制相似问题