Получить все ошибки ограничений при вставке данных из другой таблицы
У меня есть промежуточная таблица без каких-либо ограничений в моей базе данных Azure SQL (база данных Azure SQL 12.0.2000.8). Я хочу вставить данные из промежуточной таблицы в "настоящую" таблицу, для которой установлено несколько ограничений. При вставке данных я использую оператор вида
INSERT INTO <someTable> SELECT <columns> FROM StagingTable;
Теперь я получаю только первую ошибку при нарушении некоторых ограничений. Однако для моего варианта использования важно получить все нарушения, чтобы их можно было устранить в целом.
Я пробовал использовать
TRY...CATCH
механизмы, однако, это вызовет ошибку при первой ошибке и запустит предложение catch, но не продолжит работу с другими данными. Обратите внимание, что правильные данные, которые не имеют нарушений, не должны вставляться, поэтому весь оператор вставки можно откатить при одной ошибке, однако я хочу видеть все нарушения, чтобы иметь возможность исправить их все без необходимости запускать оператор вставки несколько раз, чтобы получить все ошибки.
EDIT: типы ограничений, которые необходимо проверить, - это ограничения внешнего ключа, ограничения NOT NULL, повторяющиеся ключи. Приведение не выполняется, поэтому нет необходимости проверять конверсии.
2 ответа
Есть несколько вариантов:
Если вы хотите поймать информацию на уровне строки, вам нужно использовать курсоры или цикл while и попытаться вставить каждую строку в блок TRY CATCH и посмотреть, появляется ли у вас какая-либо ошибка, и записать то же самое.
Создайте другую таблицу, аналогичную основной таблице (скажем, MainCheckTable), со всеми ограничениями, отключите все ограничения и загрузите данные.
Теперь вы можете использовать DBCC CHECKCONSTRAINTS, чтобы увидеть все нарушения ограничений.Подробнее об этом.
USE DBName;
DBCC CHECKCONSTRAINTS(MainCheckTable) WITH ALL_CONSTRAINTS;
Во-первых, не смотрите на свои основные таблицы. Посмотрите на соответствующие таблицы, например, поисковые запросы и т. Д. Сначала заполните их. После того, как вы заполнили связанные таблицы (т.е. удовлетворили все связанные ограничения, добавьте данные.
Вам нужно работать в обратном направлении от таблиц с наименьшими ограничениями к таблицам с наибольшими ограничениями, если это имеет смысл.
Вы должны убедиться, что в ваших связанных таблицах есть необходимые справочные значения / поля, которые вы собираетесь вставить. Это легко сделать, поскольку у вас уже есть промежуточная таблица.