Datos numéricos en SQL Server (Parte 1)

 Cuando diseñamos una base de datos debemos tener en cuenta los tipos de datos que se manejan es SQL Server. En este artículo nos enfocaremos en hacer precisiones con respecto a los tipos de datos para almacenar números. Vamos a comenzar analizando los tipos de datos decimal y numeric, los cuales son equivalentes. Comenzaremos por definir la sintaxis, la cual es la misa para ambos:
.
decimal[ (p[ ,s] )] ó numeric[ (p[ ,s] )], donde:
.
p – precisión. Es el máximo número de dígitos, tanto a la derecha como a la izquierda del punto decimal. Hay que tener en cuenta que la precisión no es el número de dígitos enteros, si no el número total de dígitos. La presición máxima es 38 y si no se indica ningun número toma el valor 18 por defecto.
.
s – escala. El valor de escala es la cantidad máxima de dígitos que se van a ubicar a la derecha del punto decimal. Este dato es opcional y solo se utiliza si el dato que se desea almacenar va a tener decimales.
.
Ahora vamos a hacer algunas tareas para demostrar cómo funcionan estos tipos de datos. Lo primero será crear una tabla temporal con campos definidos con tipo de datos numeric y decimal:
CREATE TABLE #PruebaTipoDato
(Prueba varchar(20) null,
n1 numeric(10) null,
n2 numeric(10,5) null,
n3 decimal(10) null,
n4 decimal(10,5) null)
.
Obsérvese que hemos definidos tipos de datos numeric y decimal, 2 sin escala decimal y dos con escala decimal. Ahora vamos a intentar almacenar datos en los campos definidos como numeric.
INSERT INTO #PruebaTipoDato(Prueba, n1, n2)
VALUES (‘Prueba 1 – numeric’, 1234567890, 1234567890.09876)
.
En el campo n1 se intenta insertar un número con 10 dígitos enteros, de acuerdo a la precisión definida para ese campo, mientras que el campo n2 se intenta insertar un número con 10 dígitos enteros y 5 decimales, de acuerdo a la precisión definida para ese campo. Pero esta sentencia falla, mostrando el siguiente mensaje:
Msg 8115, Level 16, State 8, Line 1
Arithmetic overflow error converting numeric to data type numeric.
The statement has been terminated.
.
Esto sucede porque por error, en el campo n2 se ha asumido que la precisión de 10 es la cantidad de dígitos enteros y la escala de 5 es la cantidad de dígitos decimales. A continuación la sentencia correcta:
INSERT INTO #PruebaTipoDato(Prueba, n1, n2)
VALUES (‘Prueba 2 – numeric’, 1234567890, 12345.09876)
.
Obsérvese aquí, que para el campo n2 ahora se intenta ingresar un número con 10 dígitos en total, de los cuales 5 son enteros y 5 son decimales. Esta sentencia se ejecuta con éxito. Veamos los datos insertados:
SELECT Prueba, n1, n2 FROM #PruebaTipoDato
WHERE Prueba = ‘Prueba 2 – numeric’
image
.
Ahora vamos a repetir los mismos pasos, pero operando sobre las columnas n3 y n4 con tipo de dato decimal:
INSERT INTO #PruebaTipoDato(Prueba, n3, n4)
VALUES (‘Prueba 3 – decimal’, 1234567890, 1234567890.09876)
.
Esta sentencia va a fallar, por las mismas razones expuestas en el ejemplo con el tipo de dato numeric:
Msg 8115, Level 16, State 8, Line 1
Arithmetic overflow error converting numeric to data type numeric.
The statement has been terminated.
.
Esta es la sentencia correcta, indicando 5 enteros y 5 decimales para la columna n4:
INSERT INTO #PruebaTipoDato(Prueba, n3, n4)
VALUES (‘Prueba 4 – decimal, 1234567890, 12345.09876)
.
Estos son los datos registrados:
SELECT Prueba, n3, n4 FROM #PruebaTipoDato
WHERE Prueba = ‘Prueba 4 – decimal

.

CONCLUSIÓN: Tener en cuenta que para los tipos de datos numéricos y decimales, la precisión es el total de dígitos soportados, tanto enteros como decimales. El simbolo “-” para números negativos y el punto decimal no se incluyen como dígitos ni en a presición ni en la escala.

Ver la parte 2 de este articulo haciendo clic aquí

Un comentario en “Datos numéricos en SQL Server (Parte 1)

Deja un comentario

Tu dirección de correo electrónico no será publicada.