В этом случае все работает как положено. Вы загружаете все как пакет, и SQL Server останавливает пакет, как только обнаруживает ошибку. К сожалению, я не знаю изящного встроенного решения. Но я думаю, что можно создать систему в базе данных, чтобы справиться с этим более эффективно. Мне нравится делать хранение / управление данными в базах данных, а не в R, поэтому мое решение очень тяжело для баз данных. Другие могут предложить вам решение, более ориентированное на R.
Сначала создайте простую таблицу без ограничений для хранения новых строк и соответствующим образом скорректируйте оператор sqlSave. Это где R будет загружать информацию в.
CREATE TABLE tblTemp(
modelid int
, password varchar(50)
, reason varchar(50)
, duplicate int()
)
GO
Ваш запрос на размещение информации в этой таблице должен принимать «Нет» для столбца «Дубликат». Я использую шаблон, где 1 = Y & 5 = N. Вы также можете пометить только те, которые являются выбросами, но я предпочитаю быть явным с моей логикой.
Вам также понадобится место для сброса всех строк, которые нарушают PK в выбросах2.
CREATE TABLE tblDuplicates(
modelid int
, password varchar(50)
, reason varchar(50)
)
GO
OK. Теперь все, что вам нужно сделать, это создать триггер, чтобы переместить новые строки из tblTemp в outliers2. Этот триггер переместит все дублирующиеся строки в tblDuplicates для последующей обработки, удаления, чего угодно.
CREATE TRIGGER FindDups
ON tblOutliersTemp
AFTER INSERT
AS
Я не собираюсь проходить и писать весь триггер. У меня нет SQL Server 2005 для тестирования, и я, вероятно, сделал бы синтаксическую ошибку, и я не хочу давать вам плохой код, но вот что нужно сделать триггеру:
- Определите все строки в tblTemp, которые будут нарушать PK в выбросах2. Если найдены дубликаты, замените дубликаты на 1. Это можно сделать с помощью оператора UPDATE.
- Скопировать все строки, где duplicate = 1, в tblDuplicates. Вы бы сделали это с INSERT INTO tblDuplicates ......
- Теперь скопируйте неповторяющиеся строки в outliers2 с помощью оператора INSERT INTO, который выглядит почти так же, как тот, который использовался в шаге 2.
- Удалите все строки из tblTemp, чтобы очистить их для следующей партии обновлений. Этот шаг важен.
Приятной особенностью такого способа является то, что sqlSave () не выдаст ошибку только потому, что вы нарушили PK, и вы можете заняться матчами позже, например завтра. : -)