2010-11-24 3 views
0

est ici le script:Erreur lors de la création d'un script SQL

create procedure sp_DescuentoAlquiler 
as 
declare @IDAlquiler int, @NumeroPelicula int, @MontoTotal float 

declare cursorAlquiler cursor for 
select a.ID, count(d.ID) as @NumeroPelicula 
from Alquiler a inner join DetalleAlquiler d on a.ID = d.IDAlquiler 
group by a.ID 

open cursorAlquiler 
    fetch next from cursorAlquiler into @IDAlquiler, @NumeroPelicula 
    while @@FETCH_STATUS = 0 
     begin 
      if(@NumeroPelicula >= 3) 
      begin 
       select @MontoTotal = SUM(d.PrecioAlquiler) 
       from DetalleAlquiler d where d.IDAlquiler = @IDAlquiler 
       update Alquiler set MontoTotal = @MontoTotal * 0.3 
       where ID = @IDAlquiler 
      end 
      fetch next from cursorAlquiler into @IDAlquiler, @NumeroPelicula 
     end 

close cursorAlquiler 
deallocate cursorAlquiler 

Je reçois une erreur dans la ligne 6 après comptage (d.ID), sur @NumeroPelicula:

Msg 102, Niveau 15, état 1, procédure sp_DescuentoAlquiler, ligne 6 Incorrect syntaxe près de '@NumeroPelicula'.

Des suggestions?

+0

Ceci est bien sûr quelque chose qui ne devrait pas être fait dans un curseur. – HLGEM

Répondre

1

Supprimez le @ de l'alias de colonne pour votre nombre.

select a.ID, count(d.ID) as NumeroPelicula 
from Alquiler a inner join DetalleAlquiler d on a.ID = d.IDAlquiler 
group by a.ID 
0

Essayez de supprimer le symbole @ ci-dessous

declare cursorAlquiler cursor for 
select a.ID, count(d.ID) as @NumeroPelicula 

devrait être

declare cursorAlquiler cursor for 
select a.ID, count(d.ID) as NumeroPelicul 
0

je besoin de données exemples pour être sûr (ANF tests approfondis) mais il semble que cela pourrait d o le travail en fonction d'un ensemble. Les curseurs sont un très mauvais choix pour ce type de traitement en raison de problèmes de performances, en particulier lorsque l'ensemble de données devient grand.

update A 
    set MontoTotal = sum(d.PrecioAlquiler) * 0.3 
    From Alquiler A 
    join (select a.ID, count(d.ID) as NumeroPelicula 
      from Alquiler a inner join DetalleAlquiler d on a.ID = d.IDAlquiler 
      group by a.ID) b 
    on a.id = b.id 
    JOIN DetalleAlquiler d 
    ON d.IDAlquiler = b.ID 
    where b.NumeroPelicula >=3 
Questions connexes