Arithmetischer Überlauf bei SELECT-Abfrage

9

In einer einfachen SELECT-Anweisung bin ich auf einen arithmetischen Überlauf gestoßen. Die Abfrage war wie folgt, z

SELECT [SaleValue] FROM Sales

[SaleValue]war vom Datentyp decimal(9,0)und keine berechnete Spalte.

Der Grund dafür war, dass die Spalte irgendwie eine Zeile hatte, in der in diesem Feld ein Wert gespeichert war, der GRÖSSER als der angegebene Datentyp war, z decimal(10,0).

Ich konnte die Auswahl nur zum Laufen bringen, wenn ich die Spalte vergrößerte. Die betreffende Tabelle enthält zwei weitere Instanzen in zwei weiteren Spalten und Zeilen.

Wie war diese Situation möglich? Wie wurde überhaupt ein Wert außerhalb des Bereichs in der Spalte gespeichert?

Ich verwende Microsoft SQL Server + Dies ist eine Basistabelle, keine Ansicht.


quelle
1
Die einzige Möglichkeit, die ich mir vorstellen kann, besteht darin, Systemtabellen über den DAC zu bearbeiten - ein ziemlich gewalttätiger Prozess, den Ihnen hoffentlich jemand sagen kann, wenn er mit dieser Datenbank durchgeführt wurde. Selbst dann bin ich mir nicht sicher, ob es überhaupt gut funktionieren würde (oder sogar möglich sein würde). Abgesehen davon brauchen wir wirklich ein Repro-Skript, um diese Situation für uns selbst zu sehen, und ich vermute, dass das Erstellen des Repros, wenn möglich, leicht jahrelange Experimente erfordern könnte.
Damien_The_Unbeliever
Schlimmer noch, ich erinnere mich nur daran, dass 9/10 ein Umschaltpunkt für die Speichergröße von decimal- a decimal(9,0)sollte 5 Bytes, a decimal(10,0)9 belegen . Ich denke, es ist weniger wahrscheinlich, dass Sie dies durch Bearbeiten der Systemtabellen tun können, da Sie dies nicht haben die richtige Speichergröße für die Daten in jeder Zeile.
Damien_The_Unbeliever
1
@Damien_The_Unbeliever Habe keine Ahnung, wie man reproduziert. Ich brauchte eine Stunde, um herauszufinden, was passiert war. Es zu sehen war wie trockenes Wasser oder kalte Hitze zu sehen. Ehrlich gesagt war ich ratlos.

Antworten:

15

Dies kann auf verschiedene Arten geschehen, z. B. wie unter Fehlerbehebung bei DBCC-Fehler 2570 in SQL Server 2005 und späteren Versionen beschrieben :

In früheren Versionen wurden aus folgenden Gründen möglicherweise ungültige oder außerhalb des Bereichs liegende Daten in der SQL Server-Datenbank gespeichert:

  • In der Quelle waren ungültige Daten vorhanden, während Masseneinfügemethoden wie das Dienstprogramm bcp verwendet wurden.
  • Ungültige Daten wurden über RPC-Ereignisaufrufe an SQL Server übergeben.
  • Andere mögliche Ursachen für die Beschädigung physischer Daten haben den Spaltenwert in einem ungültigen Zustand belassen.

Dieser Artikel enthält viele nützliche Informationen zum Thema. Die Grundlagen finden Sie in der Dokumentation DBCC CHECKDBund insbesondere in der DATA_PURITYOption.

Paul White 9
quelle