SqlBulkCopy для хранимых процедур

#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 для работы со всем набором данных сразу.