Проблема с этой простой хранимой процедурой - PullRequest
0 голосов
/ 24 ноября 2010
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 в моей базе данных, имеющей категорию 'invierno', была сниженная цена:

Вот модель:

alt text

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

Спасибо!

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010

Как уже говорил Джефф, для этого вам не нужен курсор, для этого было бы лучше просто выполнить 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 голосов
/ 24 ноября 2010

Вы не нуждаетесь в операторе select, но вам нужно выражение where в вашем операторе обновления:

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

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

0 голосов
/ 24 ноября 2010

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

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

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

update OfertaProducto set Precio = @Precio * 0.5 where IDProducto = @IDProductoOfertado
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...