Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

SMALLMONEY

Termin Definicja
SMALLMONEY

SMALLMONEY to typ danych walutowych o mniejszym zakresie i precyzji niż MONEY.

Cztery bajty i stała skala

SMALLMONEY zajmuje w SQL Server cztery bajty i przechowuje wartości od -214 748,3648 do 214 748,3647. Fizycznie jest to liczba całkowita przemnożona przez dziesięć tysięcy, co oznacza sztywne cztery miejsca po przecinku niezależnie od tego, ile ich naprawdę potrzebujemy. Typ akceptuje literały z symbolem waluty, na przykład zapis $12.50 w instrukcji INSERT, ale sam symbol nie jest zapisywany w kolumnie i nie niesie żadnej informacji o walucie.

Dla porównania MONEY zajmuje osiem bajtów i sięga wartości rzędu 922 bilionów, przy tej samej skali czterech miejsc po przecinku. Oba typy są rozwiązaniem historycznym, wywodzącym się z czasów, gdy oszczędność miejsca miała realne znaczenie, i oba pozostają zgodne wstecz w kolejnych wydaniach silnika.

SMALLMONEY, MONEY czy DECIMAL

W nowych projektach zamiast typów walutowych stosuje się DECIMAL(19,4) albo NUMERIC o skali dobranej do potrzeb. Powód jest praktyczny: DECIMAL zachowuje przewidywalne reguły precyzji przy mnożeniu i dzieleniu, podczas gdy dzielenie dwóch wartości MONEY w T-SQL obcina wynik pośredni do czterech miejsc, przez co przy przeliczaniu kursów lub rozbijaniu kwoty na raty pojawiają się grosze różnicy. Przy rozliczeniach VAT albo cenach jednostkowych podawanych z większą dokładnością cztery miejsca po przecinku bywają po prostu za małe.

SMALLMONEY ma jeszcze jedną wadę w systemach handlowych: górny limit nieco ponad 214 tysięcy wygląda bezpiecznie przy pojedynczej pozycji faktury, ale wystarczy zsumować obrót magazynu albo policyć wartość zamówienia hurtowego, żeby go przekroczyć.

Przepełnienia i pułapki konwersji

Typowy objaw awarii to komunikat o błędzie przepełnienia arytmetycznego podczas konwersji do typu smallmoney, zgłaszany pod numerem 8115. Pojawia się nie tylko przy zapisie zbyt dużej liczby, lecz również w agregatach: SUM po kolumnie SMALLMONEY zwraca wynik w tym samym typie, więc suma tysiąca poprawnych pozycji potrafi wysadzić zapytanie, mimo że każdy wiersz z osobna mieści się w zakresie. Obejściem jest jawne rzutowanie w zapytaniu, na przykład SUM(CAST(kwota AS DECIMAL(19,4))).

Kłopoty sprawia też import z arkuszy, gdzie separatorem dziesiętnym bywa raz przecinek, raz kropka, a wartość ujemna zapisana jest w nawiasie. Konwersja tekstu na typ walutowy zależy wtedy od ustawień języka sesji i potrafi zmienić kwotę o dwa rzędy wielkości bez żadnego ostrzeżenia.

Bazy programów handlowych pod opieką techniczną

Wdrażamy i serwisujemy Subiekta, WAPRO oraz rozwiązania Comarch, które opierają się na SQL Server, więc typy walutowe spotykamy w tych bazach codziennie. Zajmujemy się przenoszeniem instancji na nowy serwer, odzyskiwaniem baz po awarii dysku, kontrolą planów kopii zapasowych i optymalizacją zapytań, które zaczęły zwalniać wraz z przyrostem dokumentów. Pracujemy całą dobę przez siedem dni w tygodniu, co ma znaczenie, gdy baza handlowa staje w środku miesiąca.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę