麻烦这个简单的存储过程

时间:2010-11-24 16:15:07

标签: sql-server tsql

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'类别的价格降低了:

以下是模型:

alt text

所以我希望迭代每个OfferedProduct,如果它有一个'Invierno'类别,它将它的价格降低到50%。我很遗憾,我很遗憾。 :P

谢谢!

3 个答案:

答案 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语句立即作用于整个集合

可以更好地完成此操作