Ver Mensaje Individual
  #1 (permalink)  
Antiguo 03/09/2006, 23:31
innerweb
 
Fecha de Ingreso: abril-2003
Ubicación: La Plata
Mensajes: 14
Antigüedad: 21 años, 9 meses
Puntos: 0
transaccion dentro de un while ???

Hola amigos, estoy intentando crear un procedimiento almacenado que inserta una pregunta en la tabla ex_questions, n respuestas en la tabla ex_answers y el id de la respuesta correcta a la tabla ex_answers_correct

las respuestas vienen en un texto separado por ##@@ delimitando las distintas respuestas, por eso es necesario el while que va recorriendo el string y agregando cada respuesta...

Mi pregunta es, la transaccion escrita como esta, funciona???

quiero que o se agrega la pregunta, las respuestas y la respuesta correcta o nada

Bueno a continuacion les dejo el codigo, desde ya muchisimas gracias a todos

Código:
DROP PROCEDURE sp_ex_insert_question
GO
CREATE PROCEDURE sp_ex_insert_question  
/* Inserta una nueva pregunta, sus posibles respuestas y cual es la correcta */  
   @module_id int,          --Modulo al que pertence la pregunta  
   @pregunta varchar,   --Pregunta  
   @respuestas varchar(5000), --Respuestas  
   @respuesta_correcta int, --Respuesta correcta  
   @resultado VARCHAR(10) OUTPUT     --Primer parámetro de salida  
AS  
   DECLARE @i int  
   DECLARE @aux varchar(5000)  
   DECLARE @question_id int  
   DECLARE @answer_id int  
   DECLARE @Error int  
   DECLARE @nro_respuesta int  
  
   BEGIN TRAN  
  
/* 1. Agregamos la pregunta */  
      insert into ex_questions (module_id, [text])  
      values (@module_id, @pregunta)  
  SET @resultado = 'FALLO PREGUNTA' 
      SET @Error=@@ERROR  
      IF (@Error<>0) GOTO TratarError        
      SET @question_id = SCOPE_IDENTITY() /* Recuperamos el id de la pregunta*/  
      set @aux = @respuestas  
      set @i = PATINDEX('%##@@%',@aux)  
      set @nro_respuesta = 1     
      WHILE @i <> 0  
      Begin  
/* 2. Insertamos las respuestas */  
         insert into ex_answers (question_id, [text])  
         values (@question_id, substring(@aux,1,@i-1))  
         SET @resultado = 'FALLO RESPUESTAS' 
         SET @Error=@@ERROR  
         IF (@Error<>0) GOTO TratarError  
/* 3. Si es correcta, agregamos como correcta */  
         IF @respuesta_correcta = @nro_respuesta /* Recuperamos el id de la respuesta correcta*/  
         Begin  
            SET @answer_id = SCOPE_IDENTITY()  
            insert into EX_ANSWERS_CORRECTS (QUESTION_ID, ANSWER_ID)   
            values (@question_id, @answer_id)  
            SET @resultado = 'FALLO RESPUESTA CORRECTA' 
            SET @Error=@@ERROR  
            IF (@Error<>0) GOTO TratarError  
         End  
         set @nro_respuesta = @nro_respuesta + 1  
  
         set @aux = substring(@aux,@i+4,len(@aux))  
         set @i = PATINDEX('%##@@%',@aux)  
      End  
   COMMIT TRAN  
   SET @resultado = 'OK'
   TratarError:   
   If @@Error<>0  
   BEGIN  
      PRINT 'Ha ecorrido un error. Abortamos la transacción'  
      ROLLBACK TRAN  
   END