Подробное сообщение об ошибке для нарушения ограничения первичного ключа в sql2008? - PullRequest
4 голосов
/ 05 февраля 2009

Я вставляю большое количество строк в пустую таблицу с ограничением первичного ключа на один столбец. Если есть ошибка повторяющегося ключа, есть ли способ узнать значение ключа (или строки), вызвавшего ошибку?

Проверка данных до вставки - это, к сожалению, не то, что я могу сделать прямо сейчас.

Использование SQL 2008.

Спасибо!


Я стараюсь избегать подсчета (*) / группирования по предметам, это вставка сотен миллионов строк из сотен разных БД (некоторые из которых находятся на удаленных серверах) ... I нет времени или места, чтобы выполнить вставку дважды.

Предполагается, что данные являются уникальными от поставщиков, но, к сожалению, их проверка не работает правильно 100% времени, и я пытаюсь хотя бы увидеть, где они не работают, чтобы помочь им устранить неполадки. 1012 *

Спасибо!

Ответы [ 5 ]

3 голосов
/ 05 февраля 2009

Нет способа сделать это, который не замедлит ваш процесс, но вот один способ, который облегчит его. Вы можете добавить триггер вместо этой таблицы для вставок и обновлений. Триггер проверит каждую запись перед вставкой и убедится, что она не вызовет нарушения первичного ключа. Вы даже можете создать вторую таблицу для обнаружения нарушений и иметь другой первичный ключ (например, поле идентификатора) для этого, и триггер вставит строки в вашу таблицу с ошибками.

Вот пример того, как триггер может работать:

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 к своей собственной существующей таблице и вставлять строки только в тех случаях, когда вы не найдете соответствия.

1 голос
/ 06 февраля 2009

Решение будет зависеть от того, как часто это происходит. Если это <10% времени, я бы сделал следующее: </p>

  1. Вставить данные
  2. Если произошла ошибка, выполните пересмотренное решение Bravax (удалите ограничение, вставьте, найдите дублирование, сообщите и уничтожьте дублирование, включите ограничение).

Это означает, что это обходится вам только в тех немногих случаях, когда происходит ошибка.

Если это происходит чаще, то я бы посмотрел на отправку мальчиков к провайдерам: -)

0 голосов
/ 08 марта 2010

Я не могу поверить, что SSIS не может легко справиться с этой «реальностью», потому что, давайте посмотрим правде в глаза, часто вам нужно и хотите иметь возможность:

  1. Проверьте, существует ли запись с определенным уникальным или первичным ключом
  2. Если нет, вставьте его
  3. Если это так, игнорируйте его или обновите.

Я не понимаю, как они выпустили бы продукт без встроенной возможности в простой и удобной форме. Как, скажем, установить атрибут компонента для автоматической проверки этого.

0 голосов
/ 05 февраля 2009

Используйте SSIS для импорта данных, чтобы он проверял это как часть потока данных. Это лучший способ справиться. Служба SSIS может отправлять плохие записи в таблицу (которую позже можно отправить поставщику, чтобы помочь им очистить свои действия) и обрабатывать хорошие.

0 голосов
/ 05 февраля 2009

Исправленный вариант:
Поскольку вы не хотите вставлять дважды, не могли бы вы:

Drop the primary key constraint.
Insert all data into the table
Find any duplicates, and remove them
Then re-add the primary key constraint

Предыдущий ответ: Вставьте данные в дубликат таблицы без ограничения первичного ключа.

Затем выполните запрос, чтобы определить строки, которые имеют повторяющиеся значения для ключевого столбца rpimary.

select count(*), <Primary Key>
from table
group by <Primary Key>
having count(*) > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...