SQL - Procedimiento Almacenado (If)

 
Vista:

Procedimiento Almacenado (If)

Publicado por Marta (8 intervenciones) el 06/03/2007 11:45:48
Necesito ayuda sobre el siguiente procedimiento almacenado,ya que me da el siguiente error y se vuelve "loco" a la hora de grabar registros.
El error es que COMMIT TRANSACTION necesita un BEGIN TRANSACTION y no se muy bien como hacerlo.

CREATE PROCEDURE CopiaCitaciones_Rodajes
(
@Citacion_Id_Origen int,
@Citacion_Id_Nueva int,
@UsuarioAlta_Id varchar(100)
)
AS

DECLARE @Figurante_Id int
DECLARE @Personaje_Id int
DECLARE @TipoFiguracion_Id int
DECLARE @Citado numeric(1,0)
DECLARE @AltaSS numeric(1,0)
DECLARE @NoAsistencia numeric(1,0)
DECLARE @Num numeric(1,0)

DECLARE cOrigen CURSOR FOR Select Figurante_Id, Personaje_Id, TipoFiguracion_Id,Citado, AltaSS,NoAsistencia from Citaciones_Rodajes where citacion_id = @Citacion_Id_Origen

OPEN cOrigen

FETCH NEXT FROM cOrigen into @Figurante_Id, @Personaje_Id, @TipoFiguracion_Id,@Citado, @AltaSS,@NoAsistencia

WHILE @@FETCH_STATUS = 0
BEGIN

*** Aquí intento extraer una serie de códigos para que no grabe repetidos ****

set @num = (Select count(*) as num from Citaciones_Rodajes where Citacion_Id = @Citacion_Id_Nueva and Figurante_Id = isnull(@Figurante_Id,0))

**** Si el resultado de la select es 0 se supone que debería grabar.... ****

if @num = 0
BEGIN TRANSACTION
INSERT INTO Citaciones_Rodajes (Citacion_Id,FechaAlta,Figurante_Id, Personaje_Id,TipoFiguracion_Id,Citado,AltaSS,NoAsistencia,UsuarioAlta_Id)
VALUES (@Citacion_Id_Nueva, getdate(), isnull(@Figurante_Id,0), @Personaje_Id, @TipoFiguracion_Id,@Citado, @AltaSS,@NoAsistencia,@UsuarioAlta_Id)
if @@error=0

COMMIT TRAN
else
ROLLBACK TRAN
end
FETCH NEXT FROM cOrigen into @Figurante_Id, @Personaje_Id, @TipoFiguracion_Id,@Citado, @AltaSS,@NoAsistencia


CLOSE cOrigen
DEALLOCATE cOrigen
GO

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Procedimiento Almacenado (If)

Publicado por Unomásnomás (36 intervenciones) el 06/03/2007 16:32:14
Yo creo q lo que sucede es que no has delimitado tus if o tu While.. especificando el BEGIN y el END.. aunq creo q lo que haz pegado está incompleto.... confirmame?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Procedimiento Almacenado (If)

Publicado por Marta (8 intervenciones) el 06/03/2007 16:49:07
Este es el procedimiento entero...se vuelve loco grabando y siempre graba el mismo registro...no avanza ni para.

CREATE PROCEDURE CopiaCitaciones_Rodajes
(
@Citacion_Id_Origen int,
@Citacion_Id_Nueva int,
@UsuarioAlta_Id varchar(100)
)
AS

DECLARE @Figurante_Id int
DECLARE @Personaje_Id int
DECLARE @TipoFiguracion_Id int
DECLARE @Citado numeric(1,0)
DECLARE @AltaSS numeric(1,0)
DECLARE @NoAsistencia numeric(1,0)
DECLARE @Num numeric(1,0)

DECLARE cOrigen CURSOR FOR Select Figurante_Id, Personaje_Id, TipoFiguracion_Id,Citado, AltaSS,NoAsistencia from Citaciones_Rodajes where citacion_id = @Citacion_Id_Origen

OPEN cOrigen

FETCH NEXT FROM cOrigen into @Figurante_Id, @Personaje_Id, @TipoFiguracion_Id,@Citado, @AltaSS,@NoAsistencia

WHILE @@FETCH_STATUS = 0
BEGIN

BEGIN TRANSACTION
set @num = (Select count(*) as num from Citaciones_Rodajes where Citacion_Id = @Citacion_Id_Nueva and Figurante_Id = isnull(@Figurante_Id,0))
COMMIT TRAN
if @num = 0
BEGIN TRANSACTION
INSERT INTO Citaciones_Rodajes (Citacion_Id,FechaAlta,Figurante_Id, Personaje_Id,TipoFiguracion_Id,Citado,AltaSS,NoAsistencia,UsuarioAlta_Id)
VALUES (@Citacion_Id_Nueva, getdate(), isnull(@Figurante_Id,0), @Personaje_Id, @TipoFiguracion_Id,@Citado, @AltaSS,@NoAsistencia,@UsuarioAlta_Id)
if @@error=0

COMMIT TRAN
else
ROLLBACK TRAN
end
FETCH NEXT FROM cOrigen into @Figurante_Id, @Personaje_Id, @TipoFiguracion_Id,@Citado, @AltaSS,@NoAsistencia


CLOSE cOrigen
DEALLOCATE cOrigen
GO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Procedimiento Almacenado (If)

Publicado por Isaías (5072 intervenciones) el 06/03/2007 21:20:14
Marta

No entiendo el porque usar cursor, en fin, creo que deberia trabajar asi:

CREATE PROCEDURE CopiaCitaciones_Rodajes
(
@Citacion_Id_Origen int,
@Citacion_Id_Nueva int,
@UsuarioAlta_Id varchar(100)
)
AS
BEGIN
SET NOCOUNT ON
-- Solo declarar lo que necesitas
DECLARE @Figurante_Id int
DECLARE @Personaje_Id int
DECLARE @TipoFiguracion_Id int
DECLARE @Citado numeric(1,0)
DECLARE @AltaSS numeric(1,0)
DECLARE @NoAsistencia numeric(1,0)
DECLARE @Num INT

INSERT INTO Citaciones_Rodajes (Citacion_Id,FechaAlta,Figurante_Id, Personaje_Id,TipoFiguracion_Id,Citado,AltaSS,NoAsistencia,UsuarioAlta_Id)
SELECT @Citacion_Id_Nueva, getdate(), isnull(Figurante_Id,0), Personaje_Id, TipoFiguracion_Id, Citado, AltaSS, NoAsistencia, @UsuarioAlta_Id
FROM Citaciones_Rodajes a
WHERE citacion_id = @Citacion_Id_Origen
AND Figurante_Id NOT IN(
SELECT Figurante_Id FROM Citaciones_Rodajes
WHERE Citacion_Id = @Citacion_Id_Nueva
AND Figurante_Id = isnull(Figurante_Id,0))
-- Aqui deberia haber una verificacion del insert
END

Advertencia: No tengo forma de probarlo, por lo que deberias hacerlo con tablas temporales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Procedimiento Almacenado (If)

Publicado por Marta (8 intervenciones) el 06/03/2007 21:34:37
Gracias, mañana lo probaré y te comento...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Procedimiento Almacenado (If)

Publicado por Marta (8 intervenciones) el 07/03/2007 09:21:05
Ya funciona,gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Procedimiento Almacenado (If)

Publicado por Isaías (5072 intervenciones) el 07/03/2007 18:23:02
Que bien.

El 99.99% de las cosas que se hacen con CURSORES, se pueden hacer con T-SQL y mucho mas eficiente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar