Este tutorial fue aprobado por especialistas para asegurar la veracidad de esta sección.
Solución:
Creo que está buscando la opción IGNORE_DUP_KEY en su índice. Eche un vistazo a la opción IGNORE_DUP_KEY ON documentada en http://msdn.microsoft.com/en-us/library/ms186869.aspx que hace que los intentos de inserción duplicados generen una advertencia en lugar de un error.
Ampliando su comentario a la respuesta de SquareCog, podría hacer:
INSERT INTO X VALUES(Y,Z) WHERE Y NOT IN (SELECT Y FROM X)
INSERT INTO X2 VALUES(Y2,Z2) WHERE Y2 NOT IN (SELECT Y FROM X2)
INSERT INTO X3 VALUES(Y3,Z3) WHERE Y3 NOT IN (SELECT Y FROM X3)
Aquí, asumo que la columna Y está presente en las tres tablas. Tenga en cuenta que el rendimiento será deficiente si las tablas no están indexadas en Y.
Ah, sí, Y tiene una restricción única, por lo que están indexados y esto debería funcionar de manera óptima.
Aunque mi consejo enfático para usted es estructurar su sql para no intentar inserciones duplicadas (el fragmento de código de Philip Kelley es probablemente lo que necesita), quiero mencionar que un error en una declaración no necesariamente causa una reversión.
A no ser que XACT_ABORT
es ON
una transacción no se revertirá automáticamente si se encuentra un error a menos que sea lo suficientemente grave como para interrumpir la conexión. XACT_ABORT
por defecto a OFF
.
Por ejemplo, el siguiente sql inserta con éxito tres valores en la tabla:
create table x ( y int not null primary key )
begin transaction
insert into x(y)
values(1)
insert into x(y)
values(2)
insert into x(y)
values(2)
insert into x(y)
values(3)
commit
A menos que esté configurando XACT_ABORT
, se genera un error en el cliente y provoca la reversión. Si por alguna horrible razón no puede evitar la inserción de duplicados, debería poder atrapar el error en el cliente e ignorarlo.
Valoraciones y reseñas
Tienes la opción de añadir valor a nuestra información cooperando tu experiencia en las aclaraciones.