Итак, ваш код C # отправляет специальный SQL-запрос на SQL Server, используя какой метод? Рассматривали ли вы использование хранимой процедуры? Это, вероятно, обеспечит одинаковую производительность (по крайней мере, в двигателе) независимо от того, кто его назвал.
Почему? Параметр ARITHABORT - это одна из вещей, которую оптимизатор смотрит, когда определяет, как выполнить ваш запрос (в частности, для сопоставления плана). Возможно, что план в кеше имеет те же настройки, что и SSMS, поэтому он использует кешированный план, но с противоположной настройкой ваш код C # вызывает принудительную перекомпиляцию (или, возможно, вы используете действительно BAD план в кеше), что, безусловно, может снизить производительность во многих случаях.
Если вы уже вызываете хранимую процедуру (вы не опубликовали свой запрос, хотя я думаю, что вы хотели это сделать), вы можете попробовать добавить OPTION (RECOMPILE) к некорректному запросу (или запросам) в хранимой процедуре. Это будет означать, что эти утверждения будут всегда перекомпилироваться, но это может предотвратить использование плохого плана, который вы, похоже, нарушаете. Другой вариант - убедиться, что при компиляции хранимой процедуры пакет выполняется с параметром SET ARITHABORT ON.
Наконец, вы, кажется, спрашиваете, как вы можете изменить настройку ARITHABORT в SSMS. Я думаю, что вы хотели спросить, как вы можете заставить установку ARITHABORT в вашем коде. Если вы решите продолжить отправку специального SQL-кода из своего приложения на C #, то, конечно, вы можете отправить команду в виде текста, содержащего несколько операторов, разделенных точками с запятой, например ::
SET ARITHABORT ON; SELECT ...
Дополнительную информацию о причинах возникновения этой проблемы см. В замечательной статье Эрланда Соммарскога: