Длительная хранимая процедура из ADO.NET или классического ADO

Предположим, что Stored Proc запускается за 10 минут и не возвращает данных.

Как правильно вызвать хранимую процедуру в SQL Server, чтобы ваш код не ждал результата? Есть ли способ справиться с этим через T-SQL или соединение? Что-то, что работает в ADO.NET и классическом ActiveX ADO?

Единственный способ, о котором я подумал:
1) Создайте задание в своем T-SQL
2) Загрузите код на основе T-SQL в первый шаг задания.
3) Убедитесь, что последняя строка ваш код удаляет задание.
4) Выполнить задание (я уверен, что это не заставит вас ждать ответа) Я знаю, что это очень плохо и хакерски ... но

Есть ли какой-нибудь другой T-SQL, о котором я не думаю, что вы можете обернуть сохраненную процедуру, чтобы сказать: «Я знаю, что нет ответа ... поэтому я предпочитаю не ждать»?


person BuddyJoe    schedule 19.01.2009    source источник


Ответы (4)


Да, ты можешь

  1. вызовите его асинхронно, используя SqlCommand.BeginExecuteNonQuery ()
  2. Или вызовите его асинхронно для делегата (будет использовать поток из пула потоков),
  3. или в отдельной ветке (созданной вами)
  4. В классическом ADO используйте параметр Option в методе открытия соединения:

    oConnection.Open (,,, adAsyncConnect)

person Charles Bretana    schedule 19.01.2009

Для .Net попробуйте .BeginExecuteNonQuery() метод вашего SqlCommand объекта. Однако не уверен, как это будет работать с ActiveX ADO.

person Joel Coehoorn    schedule 19.01.2009

Я бы попытался переписать любой SP, который занимал бы так много времени, если бы он не вносил изменения или не вставлял очень большое количество записей. Если у вас есть sp, занимающий более 30 секунд в пользовательском интерфейсе, я говорю, что у вас очень большая вероятность проблемы с производительностью. Есть ли у рассматриваемой процедуры курсор? В таком случае вы, вероятно, сможете сократить время до миллисекунд при правильной настройке производительности. Я бы хотел подумать о настройке производительности, прежде чем делать обходной путь, чтобы пользовательский интерфейс продолжал работать без завершения процесса.

Вы говорите, что он не возвращает записей, но что пользователю нужно знать, если он не работает? Если они перешли к чему-то другому, они будут думать, что это успешно завершено.

person HLGEM    schedule 19.01.2009
comment
Я хочу, чтобы определенное количество пользователей с ролью администратора могло запускать эту процедуру. Это не совсем стандартный процесс пользовательского интерфейса. - person BuddyJoe; 19.01.2009

Запустите его в отдельном потоке и просто дайте ему умереть.

person Otávio Décio    schedule 19.01.2009