Чтобы увидеть различия, мы можем посмотреть в документации:
Документация для денег :
Data type Range Storage
money -922,337,203,685,477.5808 to 922,337,203,685,477.5807 8 bytes
smallmoney -214,748.3648 to 214,748.3647 4 bytes
Типы данных money и smallmoney с точностью до десятитысячной доли денежных единиц, которые они представляют.
Сравнить с десятичным :
При использовании максимальной точности действительные значения находятся в диапазоне от -10 ^ 38 + 1 до 10 ^ 38 - 1.
Precision Storage
1 - 9 5 bytes
10 - 19 9 bytes
20 - 28 13 bytes
29 - 38 17 bytes
Так что они не совсем эквивалентны, просто похожи. DECIMAL (19,4) имеет немного больший диапазон, чем MONEY (он может хранить от -10 ^ 15 + 0,0001 до 10 ^ 15 - 0,0001), но ему также требуется еще один байт памяти.
Другими словами, это работает:
CREATE TABLE Table1 (test DECIMAL(19,4) NOT NULL);
INSERT INTO Table1 (test) VALUES
(999999999999999.9999);
SELECT * FROM Table1
999999999999999.9999
Но это не так:
CREATE TABLE Table1 (test MONEY NOT NULL);
INSERT INTO Table1 (test) VALUES
(999999999999999.9999);
SELECT * FROM Table1
Arithmetic overflow error converting numeric to data type money.
Есть также семантическая разница. Если вы хотите хранить денежные значения, имеет смысл использовать тип money.