none
Evitar detener ejecución script RRS feed

  • Pregunta

  • Buen día para todos!

    tengo una lista de datos en una tabla A que debo seleccionar para actualizar en una tabla existente B. es posible que durante la actualización, algunos datos generen conflicto y que no puedan actualizarse porque presentarian datos duplicados con otros ya existentes en la tabla B.

    Existe una forma de que el script no se detenga y siga intentando realizar las siguientes actualizaciones si algunos presentan este conflicto?....ya que de la forma tradicional, se detiene la ejecución del script.

    Agradezco sus respuestas

    sábado, 29 de agosto de 2020 20:44

Respuestas

  • Existe una forma de que [...] siga intentando realizar las siguientes actualizaciones si algunos presentan este conflicto?

    Hay varias.

    La primera es evitar el conflicto. Para ello, en lugar de hacer "update loquesea where campo=valor", puedes poner "if not exists (select 1 from la tabla where condicionQueCausaConflicto) update loquesea where campo=valor". También puedes usar la sentencia MERGE si te resulta más cómoda que el "IF NOT EXISTS".

    Otra opción es usar un TRY...CATCH alrededor del update y despreciar el error en el CATCH.

    Otra forma es hacerlo todo dentro de una transacción. Si se presenta conflicto, se deshace la transacción y se devuelve un error al llamante. Entonces, en el código cliente, se intercepta ese error, se corrigen los conflictos, y se vuelve a realizar la transacción.

    Otra es averiguar por qué se detiene la ejecución del script cuando hay un error. Normalmente, de forma predeterminada, no es así. Es decir, los scripts SQL continúan ejecutándose aunque una de las sentencias ocasione un error. Si no lo hace, debes tener un XACT_ABORT ON o algo por el estilo que esté causando que no continúe. De ser así, bastaría con quitarlo.

    • Marcado como respuesta Yamil Casas lunes, 31 de agosto de 2020 14:37
    domingo, 30 de agosto de 2020 18:16

Todas las respuestas

  • Hola Yamil Casas:

    Si la forma es excluir los duplicados. Pero tú pregunta esta envuelta en muchos detalles que son imposibles de saber, sino presentas el código.

    Existe una forma de que el script no se detenga y siga intentando realizar las siguientes actualizaciones si algunos presentan este conflicto?....ya que de la forma tradicional, se detiene la ejecución del script.

    ¿Cuál es la forma tradicional?

    Aunque para ti este claro, tienes que dar datos mucho más precisos de tú escenario, para que alguien pueda ayudarte.

    domingo, 30 de agosto de 2020 6:09
  • Hola Yamil Casas:

    Si la forma es excluir los duplicados. Pero tú pregunta esta envuelta en muchos detalles que son imposibles de saber, sino presentas el código.

    Existe una forma de que el script no se detenga y siga intentando realizar las siguientes actualizaciones si algunos presentan este conflicto?....ya que de la forma tradicional, se detiene la ejecución del script.

    ¿Cuál es la forma tradicional?

    Aunque para ti este claro, tienes que dar datos mucho más precisos de tú escenario, para que alguien pueda ayudarte.

    Hola buen día. cuando me refiero a la forma tradicional, hablo de ejecutar <<update table set columna1=x>> .esa sentencia actualiza múltiples filas. lo que quiero es que si alguna fila presenta un error porq los datos actualizados representen un error por ejemplo, por ser duplicado en una llave que ya existe en esa tabla, continue actualizando el resto de registros que si lo permita y no me detenga la ejecución

    domingo, 30 de agosto de 2020 16:15
  • Existe una forma de que [...] siga intentando realizar las siguientes actualizaciones si algunos presentan este conflicto?

    Hay varias.

    La primera es evitar el conflicto. Para ello, en lugar de hacer "update loquesea where campo=valor", puedes poner "if not exists (select 1 from la tabla where condicionQueCausaConflicto) update loquesea where campo=valor". También puedes usar la sentencia MERGE si te resulta más cómoda que el "IF NOT EXISTS".

    Otra opción es usar un TRY...CATCH alrededor del update y despreciar el error en el CATCH.

    Otra forma es hacerlo todo dentro de una transacción. Si se presenta conflicto, se deshace la transacción y se devuelve un error al llamante. Entonces, en el código cliente, se intercepta ese error, se corrigen los conflictos, y se vuelve a realizar la transacción.

    Otra es averiguar por qué se detiene la ejecución del script cuando hay un error. Normalmente, de forma predeterminada, no es así. Es decir, los scripts SQL continúan ejecutándose aunque una de las sentencias ocasione un error. Si no lo hace, debes tener un XACT_ABORT ON o algo por el estilo que esté causando que no continúe. De ser así, bastaría con quitarlo.

    • Marcado como respuesta Yamil Casas lunes, 31 de agosto de 2020 14:37
    domingo, 30 de agosto de 2020 18:16
  • Hola Yamil Casas:

    También puedes implementar un trigger instead of y descartar las filas que no cumplan tus reglas de entrada.

    Insertar varios registros con errores

    https://javifer2.wordpress.com/2020/07/10/insertar-varios-registros-con-errores-que-la-transacion-se-confirme-y-obtener-errores/

    lunes, 31 de agosto de 2020 4:09
  • Existe una forma de que [...] siga intentando realizar las siguientes actualizaciones si algunos presentan este conflicto?

    Hay varias.

    La primera es evitar el conflicto. Para ello, en lugar de hacer "update loquesea where campo=valor", puedes poner "if not exists (select 1 from la tabla where condicionQueCausaConflicto) update loquesea where campo=valor". También puedes usar la sentencia MERGE si te resulta más cómoda que el "IF NOT EXISTS".

    Otra opción es usar un TRY...CATCH alrededor del update y despreciar el error en el CATCH.

    Otra forma es hacerlo todo dentro de una transacción. Si se presenta conflicto, se deshace la transacción y se devuelve un error al llamante. Entonces, en el código cliente, se intercepta ese error, se corrigen los conflictos, y se vuelve a realizar la transacción.

    Otra es averiguar por qué se detiene la ejecución del script cuando hay un error. Normalmente, de forma predeterminada, no es así. Es decir, los scripts SQL continúan ejecutándose aunque una de las sentencias ocasione un error. Si no lo hace, debes tener un XACT_ABORT ON o algo por el estilo que esté causando que no continúe. De ser así, bastaría con quitarlo.

    XACT_ABORT es la clave. aunque es importante dejarlo en ON al finalizar el query ya que solo es un procedimiento especial de actualización....muchas gracias!

    • Propuesto como respuesta Extrasaludable lunes, 31 de agosto de 2020 15:50
    lunes, 31 de agosto de 2020 14:39
  • gracias por su ayuda :)
    lunes, 31 de agosto de 2020 15:50