#c# #.net
#c# #.net
Вопрос:
Предполагается, что SqlBulkCopy помогает выполнять большой объем вставок вместо отправки отдельных инструкций insert. Но как насчет вызова хранимых процедур? У меня есть процедура, в которую передаются данные, а затем она выполняет некоторые запросы в другой таблице и, возможно, вторую вставку в эту таблицу поиска.
Поскольку это не может быть преобразовано в запрос, есть ли способ использовать SqlBulkCopy для вызовов хранимых процедур или это не имеет никакого смысла?
Я выполняю только 2000 или менее вызовов одновременно для каждого подключения к БД, но хотел узнать, есть ли более эффективный способ.
Комментарии:
1. Эффективность базы данных или эффективность вашего приложения?
2. @Autstin SqlBulkCopy предназначен для повышения эффективности на стороне SQL.
Ответ №1:
Основываясь на ответе @Kev, вы можете выполнить массовую вставку в промежуточную таблицу, а затем запустить триггер для вашей хранимой процедуры.
Я предполагаю, что у вас есть ограничение FK для вашей другой таблицы, поэтому вам понадобится значение перед вставкой в целевую таблицу. Вы могли бы попробовать удалить ограничение, если это возможно. Выполните массовую вставку, после чего триггер сможет просто обновить столбцы.
Комментарии:
1. И это также работает с SqlBulkCopy.BatchSize — удобно для очень больших блоков данных, поскольку обеспечивает пакетную обработку для вас.
Ответ №2:
Единственный способ, который можно придумать для этого, — это иметь триггер в таблице назначения и установить опцию SqlBulkCopyOptions FireTriggers
.
Оттуда вы могли бы вызвать свою хранимую процедуру или поместить логику хранимой процедуры в этот триггер.
Если таблица добавляется другими клиентами (например, веб-приложением), то вам потребуется какой-то способ отличить клиент массового копирования от других обычных приложений. Я думаю, вы могли бы провести различие, установив значение имени приложения в строке подключения и проверив его в триггере с помощью SELECT APP_NAME()
.
Комментарии:
1. триггеры не будут работать, потому что sproc сначала должен выбрать из другой таблицы, чтобы увидеть, существует ли ключ, если нет, то он вставляет и получает ключ, затем он выполняет вставку в целевую таблицу. Так что на самом деле это select, [вставить,] вставка.
Ответ №3:
Если вы хотите запускать сохраненную процедуру для каждой вставленной строки, то вы как бы нарушаете цель insert, которая заключается в быстрой вставке большого количества записей. Я бы вставил в промежуточную таблицу, а затем изменил сохраненный процесс, чтобы использовать логику set для работы со всем набором данных сразу.