5

Używam NHibernate i SQL Server 2005, a ja mam indeks na kolumnie obliczeniowej w jednej z moich tabel.SQL Server - INSERT nie powiodło się z powodu "ARITHABORT"

Moim problemem jest to, że kiedy wstawić rekord do tej tabeli pojawia się następujący błąd:

INSERT failed because the following SET options have incorrect settings: 'ARITHABORT'

używam SET ARITHABORT ON; przed moimi wstawkami, ale nadal mają ten błąd.

Odpowiedz

5

Dla wkładek na stołach z kolumny obliczane, trzeba te ustawić opcje:

Opcja NUMERIC_ROUNDABORT musi być ustawiony na OFF, a następujące opcje muszą być ustawione w pozycji ON:

ANSI_NULLS 
ANSI_PADDING 
ANSI_WARNINGS 
ARITHABORT 
CONCAT_NULL_YIELDS_NULL 
QUOTED_IDENTIFIER 

spróbuj dodać to przed Twoją wkładką:

set NUMERIC_ROUNDABORT off 
set ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER on 

insert ... 
+0

co masz na myśli przez 'na twoim połączeniu'? czy powinienem ustawić je podczas tworzenia sesji w NHibernate? Ustawiam tylko 'ARITHABORT' na' ON' na insert, update i delete. –

+0

Są to opcje poziomu sesji, więc należy je wykonać tylko jeden raz na połączeniu, ale można ustawić je kilka razy, nie powodując problemu. Zobacz zaktualizowaną odpowiedź – muhmud

+0

Używam Fluent NHibernate. Czy możesz pokazać mi, jak to skonfigurować? –

5

Wpadłem dzisiaj na ten problem i rozwiązałem go. Stworzyłem filtrowany indeks na kolumnie w serwerze sql 2008 r2, ale wystąpiłby ten błąd podczas wstawiania. Widziałem, że to pytanie nie zostało całkowicie odebrane, ponieważ może być nużące, aby zawsze włączać arithabort w każdym wkładzie. Znalazłem bloga, który pokazał, że był to poziom zgodności bazy danych, który był problemem. Zmieniono poziom zgodności z 80 (2000) na 100 (2008) i problem został rozwiązany. nie jestem pewien, czy zmiana poziomu zgodności na 90 rozwiązałaby to, czy nie, ale warto spróbować.

Poziomy zgodności SQL Server i polecenie zmiany tutaj. http://msdn.microsoft.com/en-us/library/bb510680.aspx

Jeśli to nie działa lub nie można zmienić tryb zgodności jest inny obejście dodając spust w blogu mówiłem o tutaj http://chrismay.org/2013/05/23/interesting-problem-with-sql-server-arithabort-filtered-indexes-calculated-columns-and-compatibility-mode-of-80/

Należy pamiętać, że zmiana ta została wykonana na próbie bazy danych, a wszystkie aplikacje powinny być przetestowane przed wprowadzeniem takiej zmiany w produkcji. Przed zmianą upewnij się, że wszystko jest w porządku z twoim DBA.

+0

Mam szczerą nadzieję, że Twój rezydentny administrator DBA autoryzował zmianę w * zgodności poziomie *. Dokonanie tej zmiany nie może być wykonane lekko, lub bez szeroko zakrojonych testów wszystkich aplikacji śpiewać bazy danych. –

+1

Jestem DBA i znajdowałem się w testowej bazie danych, która jest skryptowana do cotygodniowego przywracania z produkcji, aby upewnić się, że kopie zapasowe są dobre :-) Muszą wykonać więcej testów, zanim zostaną zmienione w produkcji. – bpfrenchak

+0

Dobrze. To powinno być dodane do twojej odpowiedzi. –

0

Można zmienić opcje bazy danych, więc są dostępne globalnie opcji ustawionych

ALTER DATABASE [$(DatabaseName)] 
     SET ANSI_NULLS OFF, 
      ANSI_PADDING OFF, 
      ANSI_WARNINGS OFF, 
      ARITHABORT OFF, 
      CONCAT_NULL_YIELDS_NULL OFF, 
      NUMERIC_ROUNDABORT OFF, 
      QUOTED_IDENTIFIER OFF 
     WITH ROLLBACK IMMEDIATE; 
0

Otwórz SQL Server Mgt Studio, kliknij prawym przyciskiem myszy nazwę serwera, wybierz Właściwości, zakładkę otwarte połączenie, a następnie sprawdzić arytmetykę abort opcja

1

ja również napotkał ten błąd podczas wykonywania procedury przechowywanej (która aktualizuje rekordy) z aplikacji i to rozwiązać mój problem: https://support.microsoft.com/en-us/kb/305333

Więc w zasadzie, dodałem ten zestaw kodów przed wykonaniem mojej przechowywanej procedury

sqlConn = New SqlConnection(connectionString) 
If sqlConn.State = ConnectionState.Closed Then sqlConn.Open() 

sqlCmd = New SqlCommand() 
With sqlCmd 
    .Connection = sqlConn 
    .CommandType = CommandType.text 
    .CommandText = "SET ARITHABORT ON" 
    .ExecuteNonQuery() 

    .CommandType = CommandType.StoredProcedure 
    .CommandText = "MY PROCEDURE" 
    .ExecuteNonQuery() 
End With 

Mam nadzieję, że to pomaga komuś.