none
Erreur arithabort RRS feed

  • Question

  • Bonjour,

    j'ai développé une application en vb.net, j'ai réussi tant bien que mal à exécuter mes requêtes update et insert, à cause du paramètre ARITHABORT. Hier, j'ai déployé l'application chez un client, et je retrouve une fois de plus l'erreur arithabort, je n'arrive pas à résoudre ce problème.

    Avant d’exécuter une requête insert / update, j'exécute les requêtes suivantes:

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

    J'ai fais mes tests sous sql-server 2008 R2, tandis que mon client a sql-server 2008
    Merci


    Edit : problème résolu. J'ai trouvé ce site, j'ai modifié manuellement la valeur du paramètre, en le passant de False à True.
    • Modifié SquallFF8 mardi 23 juin 2015 09:18
    mardi 23 juin 2015 08:41

Toutes les réponses

  • Bonjour

    Arithmetic abort : Arrête une requête lorsqu'un dépassement de capacité ou une division par zéro se produit durant son exécution.

    ARITHABORT est true par défaut et c'est normal au niveau de l'instance, vous ne devriez pas changer ce paramètre au niveau de l'instance chez un client car ce changement de paramètre peut avoir des effets de bords à l'avenir.

    Exemple : L'absence d'erreur va faire que des rapports continueront des marcher et remonteront des données fausses.

    Vous devez changer ces paramètres dans votre applicatif au niveau de la session mais le mieux est de mettre des CONVERT(BIGINT, monChamps).

    Cas d'étude pour comprendre :

    CREATE TABLE #T (d1 CHAR(1), m1 INT)
    INSERT INTO #T VALUES ('A',2147483647)
    INSERT INTO #T VALUES ('A',2147483646)
    INSERT INTO #T VALUES ('B',2147483646)
    INSERT INTO #T VALUES ('C',255)
    INSERT INTO #T VALUES ('C',255)
    
    
    SELECT d1, SUM(m1) FROM #T GROUP BY d1
    
    SELECT d1, SUM(m1) FROM #T GROUP BY d1
    /*
    Msg 8115, Level 16, State 2, Line 5
    Une erreur de dépassement arithmétique s'est produite lors de la conversion de expression en type de données int.
    ==> normal car C1 est un INT est la somme de c'est 2 valeurs dépassent les capacités de ce type de champs, il faut un bigint
    */
    SELECT d1, SUM(CONVERT(BIGINT,m1)) FROM #T GROUP BY d1
    
    /*ARITHABORT et ANSI_WARNINGS à OFF la somme est en erreur et remonte null du coup*/
    SET ANSI_WARNINGS OFF
    SET ARITHABORT OFF 
    SELECT d1, SUM(m1) FROM #T GROUP BY d1
     

    mardi 23 juin 2015 12:33
  • ARITHABORT est true par défaut

    Mon client a fait une évolution de sa version de sql server, en passant de 2003 à 2008. Comme ces paramètres ont été ajoutés depuis, et pour garder une compatibilité, ces paramètres ont tous la valeur False par défaut.

    De plus, l'erreur rencontrée était la suivante:

    INSERT failed because the following SET options have incorrect settins : 'ARITHABORT'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtred indexes and/or query notifications and/or XML data type methods and/or spatial index operations.

    L'erreur se produisait même en voulant faire une mise à jour d'un champ de type datetime.

    mardi 23 juin 2015 12:46
  • Romulus,

    Lorsque vous avez une vue indexée (Indexed View) dans votre base de données, vous devez exécuter la commande SQL "SET ARITHABORT ON" chaque fois que vous vous connectez à SQL Server avant d'exécuter toute autre commande SQL.

    D'après Technet https://technet.microsoft.com/en-us/library/ms190306.aspx?f=255&MSPPError=-2147217396:

    1. If SET ARITHABORT is ON and SET ANSI WARNINGS is ON, these error conditions cause the query to terminate.
    2. If SET ARITHABORT is ON and SET ANSI WARNINGS is OFF, these error conditions cause the batch to terminate. If the errors occur in a transaction, the transaction is rolled back. If SET ARITHABORT is
        OFF
    and one of these errors occurs, a warning message is displayed, and NULL is assigned to the result of the arithmetic operation.
    3. If SET ARITHABORT is OFF and SET ANSI WARNINGS is OFF and one of these errors occurs, a warning essage is displayed, and NULL is assigned to the result of the arithmetic operation.

    Hope this helps!

    mardi 23 juin 2015 16:55
  • j'ai précisé dans mon 1er message que:

    1- avant d'éxécuter une requête update / insert, j'exécute de manière systématique les 2 requêtes suivantes :

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

    et je n'ai aucun soucis avec les requêtes de type sélection.

    2- chez moi, mon projet marche très bien, pas chez le client. Chez moi, j'utilise sql server 2008 R2 depuis le départ (jamais eu d'évolution), tandis que mon client était sous sql server 2003 qui a évolué en sql server 2008. La base que j'ai dans laquelle je fais mes propres tests est, ni plus ni moins, qu'une restauration d'une base de données provenant de mon client, à un moment donné.

    Suite à ces 2 constatations, je me pose la question suivante : dans mon application, est-il vraiment possible de modifier la valeur des paramètres sous sql server 2008?

    mardi 23 juin 2015 19:43
  • Avez-vous essayé de voir le niveau de compatibilité des bases de données sur les deux serveurs: le votre et le client?

    SELECT compatibility_level
    FROM sys.databases WHERE name = database_name
    
    S'il sont différents, essayez de mettre celui du client au niveau que le votre:

    ALTER DATABASE database_name 
    SET COMPATIBILITY_LEVEL=110

    110 est le niveau de compatibilité de SQL 2008 & 2008 R2.

    Hope this helps!



    • Proposé comme réponse Grégory_Nail lundi 10 août 2015 13:37
    mercredi 24 juin 2015 08:46