Duplica al insertar un conjunto de resultados en una tabla
Frecuentes
Visto 210 veces
0
En mi aplicación tengo un informe llamado 'Informe de excepción diaria' que se usa para mostrar las excepciones de ISA. En esta tabla veo entradas duplicadas (exactamente dos filas idénticas en el informe).
Detalles técnicos.
El informe de excepciones se mostrará con los datos disponibles en un table
, que son ExceptionFirstReported
que tiene entradas duplicadas. los Insert Statement
Acostumbrado a insert
la fila en el ExceptionFirstReported
está en el stored procedure
usp_Refresh_Daily_Exception_Report
.
INSERT INTO ExceptionFirstReported(
InvestorReference, ExceptionReason, First_Reported_Date, RelativeRef)
SELECT InvestorReference, ExceptionReason, Dateupdated, RelatedInvRef FROM (
SELECT * FROM DailyExceptionReport As DER
WHERE NOT EXISTS
(SELECT ExcepRptd.InvestorReference
FROM ExceptionFirstReported AS ExcepRptd
WHERE DER.InvestorReference = ExcepRptd.InvestorReference
AND DER.ExceptionReason = ExcepRptd.ExceptionReason
AND DER.RelatedInvRef = ExcepRptd.RelativeRef))
AS CI
JOIN currentISAs AN CI.InvestorReference = Status_Inv_Ref
Creemos que no puede haber entradas duplicadas con esta declaración en dos instancias diferentes, ya que no habrá fila que tenga idéntico InvestorReference
, ExceptionReason
y `RelacionInvRef.
Sin embargo, estamos teniendo entradas duplicadas. Este es el único insert
declaración utilizada para insertar filas en el table
. y las mesas DailyExceptionReport
y currentISAs
no contenía duplicados antes.
La consulta de inserción mencionada anteriormente se ha llamado en un procedimiento de almacenamiento 'usp_refresh_dailyreport' y el SP se ha ejecutado solo una vez en un ciclo.
@returnvalue = Ejecutivo usp_refresh_dailyreport
si @ valor de retorno = 1
luego
InversorReferencia Excepción Motivo First_reported_dt
Recent_reported_dt ref.relativa report_gen_date
442643169642 Saldo cero 2012-04-11 09:54:00
2012-05-04 23:58:00 NULO
442643169642 > Una ISA 2012-04-21 06:30:00 2012-04-23 23:58:00 452750423823 NULO
442643169642 > Una ISA 2012-04-21 06:30:00
2012-04-23 23:58:00 452750423823 NULO
Chicos en los datos anteriores de la tabla 'ExceptionFirstReported', las dos últimas filas son idénticas y contienen la misma referencia relativa (no nula). Disculpen a los chicos, la 'referencia relativa' no es un campo nulo, pero podría tener datos en blanco como la primera fila.
1 Respuestas
1
¿Está ejecutando esta inserción al mismo tiempo en varios subprocesos? Dos subprocesos pueden ejecutar la verificación de existencia, no encontrar nada y hacer la inserción de los mismos datos.
Le recomiendo que agregue un índice único para asegurarse al 100% de que no está insertando registros duplicados. Es mejor tener una excepción (procesable) que datos corruptos.
Puede solucionar esto haciendo que nuestra declaración se ejecute bajo el nivel de aislamiento de transacciones serializable.
contestado el 03 de mayo de 12 a las 18:05
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas sql sql-server sql-server-2005 or haz tu propia pregunta.
gracias amigo. El problema es que no puedo agregar un índice a la tabla porque con el índice principal agregado a la tabla, si la consulta de inserción intenta insertar el duplicado, el proceso se detendrá con un error. Estoy trabajando con el sistema Bank Live. Este informe tiene que ser generado diariamente. - user1373129