Они на самом деле эквивалентны, но они являются независимыми типами, а не технически синонимами, такими как ROWVERSION и TIMESTAMP - хотя их, возможно, упоминали как синонимы в документации когда-то. Это немного другое значение синонима (например, они неразличимы, за исключением имени, ни один не является псевдонимом для другого). Иронично, верно?
То, что я интерпретирую из формулировки в MSDN, на самом деле:
Эти типы идентичны, они просто имеют разные имена.
Кроме значений type_id, все здесь идентично:
SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');
Я абсолютно не знаю никаких поведенческих различий между ними, и, возвращаясь к SQL Server 6.5, я всегда считал их взаимозаменяемыми на 100%.
for DECIMAL(18,2) and NUMERIC(18,2)? Assigning one to the other is technically a "conversion"?
Только если вы сделаете это явно. Вы можете легко это доказать, создав таблицу, а затем проверив план запроса на наличие запросов, которые выполняют явные или - вы можете ожидать - неявные преобразования. Вот простая таблица:
CREATE TABLE [dbo].[NumDec]
(
[num] [numeric](18, 0) NULL,
[dec] [decimal](18, 0) NULL
);
Теперь выполните эти запросы и запишите план:
DECLARE @num NUMERIC(18,0);
DECLARE @dec DECIMAL(18,0);
SELECT
CONVERT(DECIMAL(18,0), [num]), -- conversion
CONVERT(NUMERIC(18,0), [dec]) -- conversion
FROM dbo.NumDec
UNION ALL SELECT [num],[dec]
FROM dbo.NumDec WHERE [num] = @dec -- no conversion
UNION ALL SELECT [num],[dec]
FROM dbo.NumDec WHERE [dec] = @num; -- no conversion
у нас есть явные преобразования там, где мы их просили, но нет явных преобразований там, где мы могли бы их ожидать. Кажется, оптимизатор также рассматривает их как взаимозаменяемые.
Лично я предпочитаю использовать термин DECIMAL только потому, что он гораздо более точный и описательный. БИТ тоже "числовой".