Создание операторов вставки с ограничениями внешнего ключа

У меня проблема, когда удалены целые столы данных. Это дочерняя таблица и содержит свой собственный первичный ключ, внешний ключ для его родителя и некоторые другие данные.

Я попытался использовать Merge, сгенерированный из хранимой процедуры, которую я нашел здесь: https://github.com/readyroll/generate-sql-merge

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

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

Мне бы очень понравился способ генерации 1000-х вставных заявлений с надписью If Exists выше каждого из них

IF NOT EXISTS (select PK from ChildTable where ID = <about to be inserted>) AND EXISTS (select FK from ParentTable where ID = <about to be inserted>) INSERT RECORD OUTPUT PK TO LOG TABLE 

Theres около 20 000 записей, поэтому его действительно то, что я не хочу делать вручную, а поскольку событие удаления произошло несколько раз в течение нескольких месяцев, мне нужно создать данные из нескольких разных баз данных, чтобы воссоздать всю картину.

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

Любые советы по моему подходу также будут приветствоваться.

Благодаря 🙂

Короче говоря, я пробовал несколько способов исправить это, и лучше всего было сгенерировать инструкции Insert для таблицы с использованием сценариев SQL Generate и привести их в таблицу temp.

Поскольку я только хотел импортировать 90% данных и исключать конкретные записи на основе нескольких условий, мне изначально полагалось, что я должен обернуть каждую Insert с IF, но 20 000 IFs сломались при попытке создать план запроса.

Вместо этого я вставил все записи без фильтра в таблицу temp. Затем я удалил все записи, которые я не хотел из этой таблицы, с несколькими инструкциями Delete.

Наконец, я сказал, что для всех оставшихся данных в таблице temp вставьте его в фактическую правильную таблицу, где данные изначально отсутствовали.

Это работало отлично, и SQL Manager смог работать без сбоев. Также было намного яснее, что я делал, и мне не пришлось добавлять много сложных IFs в построитель строк.

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

Что касается построителя строк, запрос был таким долгим и сложным, и Excel стонал около 256 символов, я закончил использование 20 + столбцов для создания моего запроса после конкатенирования 26 столбцов данных. Когда я использовал функцию автоматического форматирования перетаскивания в Excel, это привело бы к сбою моей машины, проходящей через так много записей, и у меня есть довольно грубая машина!

Использование сценария Generate, а не построитель строк, также имело преимущество не изменять данные в любом случае. Это было пурли, как для подобных, так что странные персонажи и новые линии и т. Д. Не были проблемой.

  • SQL Server генерирует уникальное значение
  • SQL быстрые INSERT без UPDATE
  • Символы для использования при \ r \ n при вставке в SQL Server
  • SQL Server: строки не соответствуют порядку
  • Объединение двух значений в Insert - SQL
  • не может вставлять данные в базу данных
  • Вставить скрипт для определенного набора строк в SQL
  • SQL Server: вставьте строку в другую таблицу для каждой строки в другой таблице, которая соответствует критерию
  • Можно ли внедрить ручное приращение с помощью простого SQL INSERT?
  • Сравнение с вставкой в ​​запрос лучше
  • Есть ли лучший способ получить уникальный идентификатор в INSERT?
  • Давайте будем гением компьютера.