Нет способа сделать это, который не замедлит ваш процесс, но вот один способ, который облегчит его. Вы можете добавить триггер вместо этой таблицы для вставок и обновлений. Триггер проверит каждую запись перед вставкой и убедится, что она не вызовет нарушения первичного ключа. Вы даже можете создать вторую таблицу для обнаружения нарушений и иметь другой первичный ключ (например, поле идентификатора) для этого, и триггер вставит строки в вашу таблицу с ошибками.
Вот пример того, как триггер может работать:
CREATE TRIGGER mytrigger ON sometable
INSTEAD OF INSERT
AS BEGIN
INSERT INTO sometable SELECT * FROM inserted WHERE ISNUMERIC(somefield) = 1 FROM inserted;
INSERT INTO sometableRejects SELECT * FROM inserted WHERE ISNUMERIC(somefield) = 0 FROM inserted;
END
В этом примере я проверяю поле, чтобы убедиться, что оно числовое, прежде чем вставлять данные в таблицу. Вместо этого вам нужно будет изменить этот код, чтобы проверить наличие нарушений первичного ключа - например, вы можете присоединить таблицу INSERTED к своей собственной существующей таблице и вставлять строки только в тех случаях, когда вы не найдете соответствия.