Нет, вы не можете избежать этого поведения. Это результат того, как TdsParser.ThrowExceptionAndWarning () записывается
особенно эта строка
bool breakConnection = this.AddSqlErrorToCollection(ref temp, ref this._errors) | this.AddSqlErrorToCollection(ref temp, ref this._attentionErrors);
breakConnection |= this.AddSqlErrorToCollection(ref temp, ref this._warnings);
breakConnection |= this.AddSqlErrorToCollection(ref temp, ref this._attentionWarnings);
Я предполагаю, что по какой-либо причине один из наборов _error или _attentionErrors пуст для ExecuteScaler, а не для ExecuteNonQuery.
Я уверен, что если ты побродишь достаточно, ты, наверное, узнаешь почему.
В любом случае, кажется, у вас уже есть обходной путь. Используйте только первый элемент в SQLExecption.Error