Respuestas:
Ellos son iguales. Numérico es funcionalmente equivalente a decimal.
MSDN: decimal y numérico
decimal
es exactamente tan preciso como se declara, mientras que numeric
es al menos tan preciso como se declara. En SQL Server, ambos son exactamente tan precisos como declarados, es decir, no utiliza la flexibilidad numeric
que permite el estándar.
Column '<referencedColumn>' is not the same data type as referencing column '<parentTable>.<parentColumn>' in foreign key '<yourKeyName>'
. Ambos deben ser NÚMEROS (x, y), o ambos deben ser DECIMALES (x, y).
decimal
es al menos tan preciso como se declara, mientras que numeric
es exactamente tan preciso como se declara.
Esto es lo que dice el estándar SQL2003 (§6.1 Tipos de datos) sobre los dos:
<exact numeric type> ::=
NUMERIC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
| DECIMAL [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
| DEC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
| SMALLINT
| INTEGER
| INT
| BIGINT
...
21) NUMERIC specifies the data type
exact numeric, with the decimal
precision and scale specified by the
<precision> and <scale>.
22) DECIMAL specifies the data type
exact numeric, with the decimal scale
specified by the <scale> and the
implementation-defined decimal
precision equal to or greater than the
value of the specified <precision>.
Que yo sepa, no hay diferencia entre los tipos de datos NUMÉRICOS y DECIMALES. Son sinónimos entre sí y cualquiera de los dos puede ser utilizado. Los tipos de datos DECIMAL y NUMERIC son tipos de datos numéricos con precisión y escala fijas.
Editar:
Hablar con algunos colegas tal vez tenga algo que ver con DECIMAL como el estándar ANSI SQL y NUMERIC como uno que Mircosoft prefiere, ya que se encuentra más comúnmente en los lenguajes de programación. ...Tal vez ;)
Son sinónimos, no hay ninguna diferencia. Los tipos de datos decimal y numérico son tipos de datos numéricos con precisión y escala fijas.
-- Initialize a variable, give it a data type and an initial value
declare @myvar as decimal(18,8) or numeric(18,8)----- 9 bytes needed
-- Increse that the vaue by 1
set @myvar = 123456.7
--Retrieve that value
select @myvar as myVariable
La respuesta de Joakim Backman es específica, pero esto puede aportarle una claridad adicional.
Hay una pequeña diferencia. Según SQL For Dummies, 8a edición (2013):
El tipo de datos DECIMAL es similar a NUMERIC. ... La diferencia es que su implementación puede especificar una precisión mayor que la que usted especifica; de ser así, la implementación usa la mayor precisión. Si no especifica precisión o escala, la implementación usa valores predeterminados, como lo hace con el tipo NUMERIC.
Parece que la diferencia en algunas implementaciones de SQL está en la integridad de los datos. DECIMAL permite el desbordamiento de lo que se define en función de algunos valores predeterminados del sistema, mientras que NUMERIC no lo hace.