2010-11-24 2 views
0
create procedure sp_DescuentoCategoriaInvierno 
as 
declare @IDProductoOfertado int, @ProductoNombre nvarchar(256), @CategoriaNombre nvarchar(256), @SubcategoriaNombre nvarchar(256), @Precio float 

declare cursorProducto cursor for 
select o.IDProducto, p.Nombre, c.Nombre, s.Nombre, o.Precio from OfertaProducto as o 
inner join Producto as p on o.IDProducto = p.ID 
inner join Subcategoria as s on p.IDSubcategoria = s.ID 
inner join Categoria as c on s.IDCategoria = c.ID 
order by p.Nombre 

open cursorProducto 
    fetch next from cursorProducto into @IDProductoOfertado, @ProductoNombre, @CategoriaNombre, @SubcategoriaNombre, @Precio 
    while @@FETCH_STATUS = 0 
     begin 
      if(@CategoriaNombre='Invierno') 
      begin   
       select @Precio --TROUBLE IS HERE. 
       from OfertaProducto --WHAT SHOULD I DO? 
       update OfertaProducto set Precio = @Precio * 0.5     
      end 
      fetch next from cursorProducto into @IDProductoOfertado, @ProductoNombre, @CategoriaNombre, @SubcategoriaNombre, @Precio 
     end 

close cursorProducto 
deallocate cursorProducto 

Это один достаточно простым, я просто пытаюсь, чтобы каждый OferredProduct в моем dabase, который имеет категорию «Invierno» имеет по сниженной цене:Проблема с этой простой хранимой процедурой

Вот модель :

alt text

Так что я хотел бы его повторять через каждый OfferedProduct, если он имеет категорию «Invierno» снизить цены на него до 50%. Я не знаю что-то маленькое, я уверен. : P

Спасибо!

ответ

2

Как ранее сказал Джефф, для этого вам не нужен курсор, для этого лучше всего использовать инструкцию UPDATE. Попробуйте что-то вроде этого:

UPDATE o 
SET o.Precio = o.Precio * 0.5 
from OfertaProducto as o 
inner join Producto as p on o.IDProducto = p.ID 
inner join Subcategoria as s on p.IDSubcategoria = s.ID 
inner join Categoria as c on s.IDCategoria = c.ID 
WHERE c.Nombre = 'Invierno' 
0

Я не понимаю этого:

select @Precio 
from OfertaProducto 
update OfertaProducto set Precio = @Precio * 0.5 

@Precio уже выбран через курсор, так почему вы выбрали его снова. И вам также нужно указать идентификатор в инструкции обновления. В противном случае все строки будут обновлены. Я думаю, что это будет сделать это:

update OfertaProducto set Precio = @Precio * 0.5 where IDProducto = @IDProductoOfertado 
0

Вам не нужно отборное заявление, но вам необходимо где положение в выписке обновление:

update OfertaProducto set Precio = @Precio * 0.5 
where [email protected] 

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

+0

В вашем примере это IDProducto внешний ключ в моем дальнем правом столе? – 2010-11-24 16:24:57

Смежные вопросы