Sé que los tipos de datos NUMÉRICOS y DECIMALES en SQL Server funcionan de la misma manera: la sintaxis para crearlos es la misma, los rangos de valores que puede almacenar en ellos son los mismos, etc.
Sin embargo, la documentación de MSDN describe la relación entre los dos de la siguiente manera:
numérico es funcionalmente equivalente a decimal.
Normalmente, cuando veo el calificador " funcionalmente equivalente", significa que las dos cosas no son exactamente lo mismo, sino que son dos tipos diferentes que no se pueden distinguir desde el exterior .
¿Es esta implicación verdadera? ¿Existen diferencias entre NUMÉRICO y DECIMAL que simplemente se comportan de la misma manera con un observador externo? ¿O son realmente equivalentes, por ejemplo, NUMERIC es solo un sinónimo heredado de DECIMAL?
fuente
Respuestas:
En realidad son equivalentes, pero son tipos independientes, y no técnicamente sinónimos, como
ROWVERSION
yTIMESTAMP
, aunque pueden haber sido referidos como sinónimos en la documentación alguna vez . Ese es un significado ligeramente diferente del sinónimo (por ejemplo, no se pueden distinguir excepto en el nombre, ninguno es un alias para el otro). Irónico, ¿verdad?Lo que interpreto de la redacción en MSDN es en realidad:
Aparte de los
type_id
valores, todo aquí es idéntico:No tengo absolutamente ningún conocimiento de las diferencias de comportamiento entre los dos, y volviendo a SQL Server 6.5, siempre los he tratado como 100% intercambiables.
Solo si lo haces explícitamente. Puede probar esto fácilmente creando una tabla y luego inspeccionando el plan de consultas para consultas que realizan conversiones explícitas o, como es de esperar, implícitas. Aquí hay una tabla simple:
Ahora ejecute estas consultas y capture el plan:
Como se muestra en SQL Sentry Plan Explorer *, el plan no es realmente interesante:
Pero la pestaña Expresiones seguro es:
Como comenté anteriormente, tenemos conversiones explícitas donde las solicitamos, pero no conversiones explícitas donde podríamos haberlas esperado. Parece que el optimizador también los trata como intercambiables.
Siga adelante y pruebe esta prueba también (datos e índices).
Ahora ejecute esta consulta:
El plan no tiene conversiones (de hecho, la pestaña Expresiones está vacía):
Incluso estos no conducen a ninguna conversión inesperada. Por supuesto, lo ve en el RHS en el predicado, pero en ningún caso tuvo que ocurrir ninguna conversión contra los datos de la columna para facilitar la búsqueda (mucho menos forzar un escaneo).
Personalmente, prefiero usar el término
DECIMAL
solo porque es mucho más preciso y descriptivo.BIT
es "numérico" también.fuente
Sin embargo, son idénticos en la práctica (del estándar SQL 2003):
21) NUMERIC especifica el tipo de datos numérico exacto, con la precisión decimal y la escala especificada por
precision
yscale
.22) DECIMAL especifica el tipo de datos numérico exacto, con la escala decimal especificada por el
scale
y la precisión decimal definida por la implementación igual o mayor que el valor del especificadoprecision
.fuente