Моя база данных содержит три таблицы с именами Object_Table
, Data_Table
и Link_Table
. Таблица ссылок содержит только два столбца: идентификатор записи объекта и идентификатор записи данных.
Я хочу скопировать данные из того места, DATA_TABLE
где они связаны с одной данной идентификацией объекта, и вставить соответствующие записи в Data_Table
и Link_Table
для другой данной идентификации объекта.
Я могу сделать это, выбрав в табличную переменную и циклически делая две вставки для каждой итерации.
Это лучший способ сделать это?
Редактировать : я хочу избежать цикла по двум причинам: во-первых, я ленив, а таблица цикла / температуры требует больше кода, больше кода означает больше мест для ошибок, а вторая причина - это проблема производительности.
Я могу скопировать все данные за одну вставку, но как получить таблицу ссылок для ссылки на новые записи данных, где каждая запись имеет новый идентификатор?
Ответы:
В одном заявлении : Нет.
В одной транзакции : да
Хорошей новостью является то, что приведенный выше код также гарантированно является атомарным и может быть отправлен на сервер из клиентского приложения с одной строкой sql в одном вызове функции, как если бы это был один оператор. Вы также можете применить триггер к одной таблице, чтобы получить эффект одной вставки. Однако в конечном итоге это все еще два оператора, и вы, вероятно, не хотите запускать триггер для каждой вставки.
источник
insert into ... select ...
заявление. Как приведенный выше код читает или перебирает данные Object_Table. Затем вам все еще нужно использовать табличную переменную, которую запрашивающий не хотел делать.Вам по-прежнему нужны два
INSERT
оператора, но, похоже, вы хотите получитьIDENTITY
из первой вставки и использовать ее во второй, и в этом случае вы можете посмотретьOUTPUT
илиOUTPUT INTO
: http://msdn.microsoft.com/en- нас / библиотека / ms177564.aspxисточник
Следующее устанавливает ситуацию, которую я имел, используя переменные таблицы.
Благодаря другому ответу, который указал мне на предложение OUTPUT, я могу продемонстрировать решение:
Оказывается, однако, что это не так просто в реальной жизни из-за следующей ошибки
Я могу еще
OUTPUT INTO
временную таблицу, а затем закончить с обычной вставкой. Так что я могу избежать цикла, но не могу избежать временной таблицы.источник
Похоже, что таблица ссылок фиксирует взаимосвязь «многие: многие» между таблицей объектов и таблицей данных.
Я предлагаю использовать хранимую процедуру для управления транзакциями. Если вы хотите вставить в таблицу объектов или данных, выполните вставки, получите новые идентификаторы и вставьте их в таблицу ссылок.
Это позволяет сохранить всю логику в одном простом для вызова sproc.
источник
Если вы хотите, чтобы действия были более или менее атомарными, я бы обязательно включил их в транзакцию. Таким образом, вы можете быть уверены, что оба произошли, или оба не произошли по мере необходимости.
источник
Вы можете создать представление, выбрав имена столбцов, требуемые оператором вставки, добавить триггер INSTEAD OF INSERT и вставить в это представление.
источник
Я хочу подчеркнуть использование
для транзакции MSSQL с несколькими операторами SQL.
См .: https://msdn.microsoft.com/en-us/library/ms188792.aspx. Они представляют собой очень хороший пример.
Итак, окончательный код должен выглядеть следующим образом:
источник
Вставка может работать только на одном столе одновременно. Несколько вставок должны иметь несколько операторов.
Я не знаю, что вам нужно выполнить циклическое преобразование табличной переменной - вы не можете просто использовать массовую вставку в одну таблицу, а затем массовую вставку в другую?
Кстати, я предполагаю, что вы имеете в виду скопировать данные из Object_Table; в противном случае вопрос не имеет смысла.
источник
Перед тем, как выполнить множественную вставку в Oracle, вы могли бы использовать прием, включающий вставку в представление, для которого был определен триггер INSTEAD OF для выполнения вставок. Можно ли это сделать в SQL Server?
источник
источник
// если вы хотите вставить то же самое, что и первая таблица
// или если вы хотите вставить определенные части таблицы один
// я знаю, что это выглядит слишком хорошо, чтобы быть правым, но это работает, и вы можете продолжать добавлять запрос, просто изменив
У меня есть 17 таблиц, в которых это работало.
источник