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
这个很简单,我只是想让我的dabase中的每个OferredProduct都有一个'invierno'类别的价格降低了:
以下是模型:
所以我希望迭代每个OfferedProduct,如果它有一个'Invierno'类别,它将它的价格降低到50%。我很遗憾,我很遗憾。 :P
谢谢!
答案 0 :(得分: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'
答案 1 :(得分:0)
我不明白这一点:
select @Precio
from OfertaProducto
update OfertaProducto set Precio = @Precio * 0.5
已经通过光标选择了 @Precio
,那么为什么要再次选择它。而且你还需要在update语句中给出一个id。否则所有行都将被更新。我想这会做到这一点:
update OfertaProducto set Precio = @Precio * 0.5 where IDProducto = @IDProductoOfertado
答案 2 :(得分:0)
您不需要select语句,但在更新语句中确实需要where子句:
update OfertaProducto set Precio = @Precio * 0.5
where IDProducto=@IDProductoOfertado
请注意,使用单个UPDATE语句立即作用于整个集合
可以更好地完成此操作