Débordement arithmétique sur la requête SELECT

9

J'ai rencontré un débordement arithmétique dans une simple instruction SELECT. La requête était comme ci-dessous, par exemple

SELECT [SaleValue] FROM Sales

[SaleValue]était de type de données decimal(9,0)et non une colonne calculée.

La raison en est que, d'une manière ou d'une autre, la colonne avait une ligne où ce champ stockait une valeur PLUS GRANDE que le type de données spécifié, par exemple decimal(10,0).

Je n'ai pu faire fonctionner la sélection que lorsque j'ai augmenté la taille de la colonne. Le tableau en question a deux autres instances dans deux autres colonnes et lignes.

Comment cette situation était-elle possible? Comment une valeur hors plage a-t-elle été enregistrée dans la colonne en premier lieu?

J'utilise Microsoft SQL Server + ceci est une table de base, pas une vue.


la source
1
La seule façon possible de penser à forcer cela à se produire serait d'éditer les tables système via le DAC - un processus assez violent qui, espérons-le, serait en mesure de vous dire si cela avait été fait pour cette base de données. Même alors, je ne suis pas sûr que cela fonctionnerait bien (ou même serait possible). En dehors de cela, nous avons vraiment besoin d'un script de repro pour voir cette situation par nous-mêmes et je soupçonne que la création de la repro, si possible, pourrait facilement prendre des années d'expérimentation.
Damien_The_Unbeliever
Pire encore, rappelez-vous que 9/10 est un point de coupure pour la taille de stockage de decimal- un decimal(9,0)devrait occuper 5 octets, un decimal(10,0)9. Donc, je pense qu'il est moins probable que vous puissiez le faire en modifiant les tables système car vous n'aurez pas la taille de stockage correcte pour les données de chaque ligne.
Damien_The_Unbeliever
1
@Damien_The_Unbeliever Je n'ai aucune idée de comment se reproduire. Il m'a fallu une heure pour comprendre ce qui s'est passé. Le voir, c'était comme voir de l'eau sèche ou de la chaleur froide. Honnêtement, cela m'a laissé perplexe.

Réponses:

15

Cela peut se produire de plusieurs manières, par exemple, comme décrit dans Dépannage de l'erreur DBCC 2570 dans SQL Server 2005 et versions ultérieures :

Des données non valides ou hors plage peuvent avoir été stockées dans la base de données SQL Server dans les versions antérieures pour les raisons suivantes:

  • Des données non valides étaient présentes dans la source lors de l'utilisation de méthodes d'insertion en bloc, telles que l'utilitaire bcp.
  • Des données non valides ont été transmises via les appels d'événements RPC effectués à SQL Server.
  • D'autres causes potentielles de corruption des données physiques ont laissé la valeur de la colonne dans un état non valide.

Cet article contient de nombreuses informations utiles sur le sujet. Pour les bases, consultez la documentation de DBCC CHECKDBet l' DATA_PURITYoption en particulier.

Paul White 9
la source