Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

procedimiento almacenado transaccion

Estas en el tema de procedimiento almacenado transaccion en el foro de SQL Server en Foros del Web. Buen dia apreciados ingenieros tengo un sp donde le ingreso informacion a 7 tablas pero mi problema radica en lo Siguiente tengo la tablas PERSONAS ...
  #1 (permalink)  
Antiguo 30/07/2015, 17:30
 
Fecha de Ingreso: febrero-2008
Mensajes: 14
Antigüedad: 16 años, 2 meses
Puntos: 0
procedimiento almacenado transaccion

Buen dia apreciados ingenieros
tengo un sp donde le ingreso informacion a 7 tablas
pero mi problema radica en lo Siguiente
tengo la tablas

PERSONAS
CORREOS
CORREOS_PERSONAS

Hago el insert en la tabla PERSONAS
Hago el insert en la tabla CORREOS
Por medio de consultas recupero los ultimos id insertados
y los guardo en variables
luego inserto en la tabla CORREOS_PERSONAS los datos guardados en las variables

mi problema esta que cuando genera un error el insert de la tabla personas
de igual me inserta en las otras 2 tablas

tengo el siguiente sp
Código SQL:
Ver original
  1. CREATE proc insertaPersonas
  2. @documento AS INT
  3. ,@codigo AS INT
  4. ,@nombres AS VARCHAR(100)
  5. ,@apellidos AS VARCHAR(100)
  6. ,@fechanacimiento AS DATE
  7.  
  8. ,@correo AS VARCHAR(100)
  9. ,@Observacorreo AS VARCHAR(100)
  10.  
  11. ,@telefono AS VARCHAR(100)
  12. ,@observaciontelefono AS VARCHAR(100)
  13.  
  14. ,@genero AS VARCHAR(100)
  15. ,@observaciongenero AS VARCHAR(100)
  16.  
  17. ,@cargo AS VARCHAR(100)
  18. ,@observacioncargo AS VARCHAR(100)
  19.  
  20. ,@estadocivil AS VARCHAR(100)
  21. ,@observacionestadocivil AS VARCHAR(100)
  22.  
  23.  
  24. AS
  25. BEGIN try
  26.     BEGIN TRANSACTION
  27.    
  28. INSERT INTO  PERSONAS (Documento,Codigo_empresario,Nombres,apellidos,fecha_nacimiento)
  29. VALUES(@documento,@codigo,@nombres,@apellidos,@fechanacimiento);
  30.  
  31. INSERT INTO  CORREOS(correo_electronico,estado_correo_electronico)
  32. VALUES(@correo,@Observacorreo);
  33.  
  34. DECLARE @idpersona AS INT
  35. SET @idpersona='';
  36. SET @idpersona = (SELECT MAX (id_persona) FROM PERSONAS)
  37.  
  38. DECLARE @idcorreo AS INT
  39. SET @idcorreo = (SELECT MAX (id_correo_electronico) FROM CORREOS)
  40.  
  41. INSERT INTO  CORREOS_PERSONAS (id_persona,id_correo_electronico)
  42. VALUES(@idpersona,@idcorreo);
  43.  
  44. INSERT INTO  TELEFONOS (numero_telefono,observacion_numero)
  45. VALUES(@telefono,@observaciontelefono);
  46.  
  47. DECLARE @idtelefono AS INT
  48. SET @idtelefono = (SELECT MAX (id_telefono) FROM TELEFONOS)
  49.  
  50. INSERT INTO  TELEFONOS_PERSONAS (id_persona,id_telefono,estado_telefono)
  51. VALUES(@idpersona,@idtelefono,@observaciontelefono);
  52.  
  53. INSERT INTO GENERO( nombre_genero,observacion_genero,id_persona)VALUES(@genero,@observaciongenero,@idpersona);
  54.  
  55. INSERT INTO CARGO(nombre_cargo,observacion,id_persona)VALUES (@cargo,@observacioncargo,@idpersona)
  56.  
  57. INSERT INTO ESTADO_CIVIL(nombre_estado_civil,observacion,id_persona)VALUES (@estadocivil,@observacionestadocivil,@idpersona)
  58.  
  59. commit tran
  60. END try
  61. BEGIN catch
  62.     ROLLBACK
  63.     print error_message()
  64. END catch

Última edición por gnzsoloyo; 01/08/2015 a las 17:24 Razón: SQL Sin etiquetar
  #2 (permalink)  
Antiguo 30/07/2015, 18:06
 
Fecha de Ingreso: febrero-2008
Mensajes: 14
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: procedimiento almacenado transaccion

pues he encontrado esta solucion y ya me funciona pero sigo sin Entenderla
Código SQL:
Ver original
  1. CREATE proc insertaPersonas1
  2. @documento AS INT
  3. ,@codigo AS INT
  4. ,@nombres AS VARCHAR(100)
  5. ,@apellidos AS VARCHAR(100)
  6. ,@fechanacimiento AS DATE
  7.  
  8. ,@correo AS VARCHAR(100)
  9. ,@Observacorreo AS VARCHAR(100)
  10.  
  11.  
  12. AS
  13. BEGIN try
  14.     BEGIN TRANSACTION
  15.    
  16. INSERT INTO  PERSONAS (Documento,Codigo_empresario,Nombres,apellidos,fecha_nacimiento)
  17. VALUES(@documento,@codigo,@nombres,@apellidos,@fechanacimiento);
  18.  
  19. DECLARE @idpersona AS INT
  20. SET @idpersona='';
  21. SET @idpersona=IDENT_CURRENT('PERSONAS')
  22.  
  23. INSERT INTO  CORREOS(correo_electronico,estado_correo_electronico)
  24. VALUES(@correo,@Observacorreo);
  25.  
  26. DECLARE @idcorreo AS INT
  27. SET @idcorreo=IDENT_CURRENT('CORREOS')
  28.  
  29. INSERT INTO  CORREOS_PERSONAS (id_persona,id_correo_electronico)
  30. VALUES(@idpersona,@idcorreo);
  31.  
  32.  
  33. commit tran
  34. END try
  35. BEGIN catch
  36.     ROLLBACK
  37.     print error_message()
  38. END catch
  39.  
  40.  
  41. SET @idpersona=IDENT_CURRENT('PERSONAS') ??
  42. SET @idcorreo=IDENT_CURRENT('CORREOS')   ??

Seguire investigando en San Google
un abrazo ingenieros
quedo atento a sus amables comentarios

Última edición por gnzsoloyo; 01/08/2015 a las 17:24 Razón: SQL Sin etiquetar
  #3 (permalink)  
Antiguo 30/07/2015, 18:14
 
Fecha de Ingreso: febrero-2008
Mensajes: 14
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: procedimiento almacenado transaccion

Encontre esta información

https://msdn.microsoft.com/es-es/library/ms175098(v=sql.120).aspx


Devuelve el último valor de identidad generado para una tabla o vista especificadas. El último valor de identidad generado puede ser para cualquier sesión y cualquier ámbito.



IDENT_CURRENT devuelve el último valor de identidad generado para una tabla específica en cualquier sesión y cualquier ámbito.
@@IDENTITY devuelve el último valor de identidad generado para cualquier tabla en la sesión actual, en todos los ámbitos.
SCOPE_IDENTITY devuelve el último valor de identidad generado para cualquier tabla en la sesión y el ámbito actuales.
Cuando el valor de IDENT_CURRENT es NULL (porque la tabla nunca ha contenido filas ni ha sido truncada), la función IDENT_CURRENT devuelve el valor de inicialización.
Las instrucciones y transacciones con errores pueden cambiar la identidad actual de una tabla y crear espacios en los valores de la columna de identidad. El valor de identidad jamás se revierte, aun cuando no se haya confirmado la transacción que intentó insertar el valor en la tabla. Por ejemplo, si se produce un error en una instrucción INSERT debido a una infracción de IGNORE_DUP_KEY, el valor de identidad actual de la tabla se sigue incrementando.
Tenga cuidado al usar IDENT_CURRENT para predecir el siguiente valor de identidad generado. El valor generado real puede ser diferente de IDENT_CURRENT más IDENT_INCR a causa de las inserciones realizadas por otras sesiones.

quedo atento a sus amables comentarios ingenieros
un abrazo
  #4 (permalink)  
Antiguo 01/08/2015, 13:38
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: procedimiento almacenado transaccion

y porque no estas usando el nombre completo de la transaccion para hacer el rollback??? y el ident current para que lo usas?? quieres el valor que se inserto?? si es asi porque no usas mejor un trigger, o porque no lanzas tu segundo insert al asegurarte que el dato se inserto? porque como dice el articulo del final, si usas identity puede ser que el ultimo no sea el que fue asignado a la tabla......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 02/08/2015, 11:07
 
Fecha de Ingreso: febrero-2008
Mensajes: 14
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: procedimiento almacenado transaccion

Hola Libras muchas gracias por responder
como aseguro esto que tu dices

o porque no lanzas tu segundo insert al asegurarte que el dato se inserto? porque como dice el articulo del final, si usas identity puede ser que el ultimo no sea el que fue asignado a la tabla......




de antemano quedo muy agradecido por tus amables respuestas
Cordial saludo
  #6 (permalink)  
Antiguo 02/08/2015, 11:22
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: procedimiento almacenado transaccion

Puedes usar desd diferentes bloques try y catch para cada insercion, manejo de errores con raiseerror, te dejo un liga para que tengas una mejor idea :)

http://dba.stackexchange.com/questio...ript-execution
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: almacenado, procedimiento, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:02.