Estoy moviendo registros de una base de datos a otra, como parte del proceso de archivo. Quiero copiar las filas a la tabla de destino y luego eliminar las mismas filas de la tabla de origen.
Mi pregunta es, ¿cuál es la forma más eficiente de verificar si la primera inserción fue exitosa antes de eliminar las filas?
Mi idea es esta, pero siento que hay una mejor manera:
@num_records=select count(ID) from Source_Table where (criteria for eligible rows)
insert * into Destination_Table where (criteria for eligible rows)
if ((select count(ID) from Destination_Table where (criteria) )=@numrecords)
delete * from Source_Table where (criteria)
¿Es mejor / posible combinarlo con la función RAISERROR? ¡Gracias!
fuente
OUTPUT
cláusula? No es porque es todo una declaración. También evita el problema de tener que leer las filas dos veces (y posiblemente perder las filas que se agregaron entre la lectura para la inserción y la lectura para la eliminación)La forma en que he pensado en archivar (que estoy seguro tampoco es perfecto), es agregar una columna de bits a la nueva tabla de archivo como 'Archivado' que tendría el valor de 1 después de la transferencia exitosa de un registro. Y una vez que transfiere todos los registros, puede realizar una operación de eliminación mientras busca este valor de campo 'Archivado' de '1', es decir, Verdadero de la tabla archivada.
Y estoy de acuerdo con Mike en usar Try / Catch.
fuente
Prueba esto:
fuente