W prostej instrukcji SELECT napotkałem przepełnienie arytmetyczne. Zapytanie było jak poniżej, np
SELECT [SaleValue] FROM Sales
[SaleValue]
miał typ danych, decimal(9,0)
a nie kolumnę obliczeniową.
Powodem tego było to, że jakoś kolumna miała wiersz, w którym to pole zapisywało wartość WIELKĄ niż określony typ danych, np decimal(10,0)
.
Mogłem sprawić, by zaznaczenie działało tylko wtedy, gdy zwiększyłem rozmiar kolumny. Ta tabela ma dwa inne wystąpienia w dwóch innych kolumnach i wierszach.
Jak to możliwe? Jak w pierwszej kolejności zapisano wartość spoza zakresu w kolumnie?
Używam serwera Microsoft SQL + to jest tabela podstawowa, a nie widok.
decimal
- adecimal(9,0)
powinien zajmować 5 bajtów, adecimal(10,0)
9. Więc myślę, że jest mniej prawdopodobne, że możesz to zrobić poprzez edycję tabel systemowych, ponieważ nie będziesz miał prawidłowy rozmiar pamięci dla danych w każdym wierszu.Odpowiedzi:
Może się to zdarzyć na kilka sposobów, na przykład zgodnie z opisem w Rozwiązywanie problemów z błędem DBCC 2570 w SQL Server 2005 i późniejszych wersjach :
Ten artykuł zawiera wiele przydatnych informacji na ten temat. Dla podstaw, zapoznać się z dokumentacją
DBCC CHECKDB
orazDATA_PURITY
opcję w szczególności.źródło