Archivos de la categoría: Transact-SQL

Error converting data type nvarchar to float — FFFFUUUUUUUUU

¡Que taaaaaal! No estaba muerto, ni andaba de parranda. Estaba cambiándome de hosting todos los sitios que tenía. Me fui de GoDaddy a Bluehost. Hasta el momento va todo bien y espero que no falle en la mitad del camino como lo hizo mi antiguo proveedor. Además que salía más barato. En fin. Hay que apretarse el pantalón muchas veces para poder sobrevivir y mas aun en la interné.

Estaba trabajando haciendo una conversion de tipos de datos y recibí un error así al hacer un cast:

Error converting data type nvarchar to float

¡Ups! Estaba completamente seguro que no habían letras en los registros. El problema estaba es que hacía la separacion decimal con “,” y no con “.” .

Asi que ocupé la funcion replace para corregir el panorama:

UPDATE tabla SET campo = replace(campo,',','.')

y asi fue como funcionó. Obviamente hay que hacer unos cast o convert entre medio para que la cosa ande.

¡Chau!

Usando la funcion dateadd() – Funcion de manejo de fecha y hora en SQL Server

Los motores de bases de datos tienen capacidades para manejar fechas de forma muy precisa. Es por esto que incluyen funciones para trabajar con éstas. Existen muchas funciones, pero en este caso hablaremos sobre dateadd().

La función dateadd() devuelve un valor de fecha, manipulado en uno de los elementos de la fecha. La función tiene 3 parámetros: datepart, el cambio y el elemento donde se va a manipular la fecha.
Los datepart son los componentes de una fecha. Estos son:

  • year
  • quarter
  • month
  • dayofyear
  • day
  • week
  • weekday
  • hour
  • minute
  • second
  • millisecond
  • ms
  • microsecond
  • mcsnanosecond

El numero, debe ser un valor entero. Si es un valor decimal, el decimal se truncará y solo quedará la Porción entera.

Ejemplo:
Agregar un año a la fecha actual:
SELECT DATEADD(year,1,GETDATE())

Juego con los milisegundos, nanosegundos y microsegundos (sacado desde MSDN):

DECLARE @datetime2 datetime2 = '2007-01-01 13:10:10.1111111'
SELECT '1 millisecond' ,DATEADD(millisecond,1,@datetime2)
UNION ALL
SELECT '2 milliseconds', DATEADD(millisecond,2,@datetime2)
UNION ALL
SELECT '1 microsecond', DATEADD(microsecond,1,@datetime2)
UNION ALL
SELECT '2 microseconds', DATEADD(microsecond,2,@datetime2)
UNION ALL
SELECT '49 nanoseconds', DATEADD(nanosecond,49,@datetime2)
UNION ALL
SELECT '50 nanoseconds', DATEADD(nanosecond,50,@datetime2)
UNION ALL
SELECT '150 nanoseconds', DATEADD(nanosecond,150,@datetime2);

Esto se puede usar, por ejemplo, para saber cuántas órdenes de trabajo fueron realizadas por un usuario la semana pasada.
Tiene muchos usos.
Para más información pueden visitar la referencia oficial: http://msdn.microsoft.com/es-es/library/ms186819.aspx
¡Chau!

Uso de PRIMARY KEY y UNIQUE

¿Cual se debe usar? Se debe usar la que más se acomode al escenario.
Algunos facts:

  • Una PRIMARY KEY debe ser UNIQUE, pero un UNIQUE no tiene por qué ser una PRIMARY KEY
  • Una PRIMARY KEY no acepta valores NULL. Un campo UNIQUE puede o no aceptar valores NULL
  • Solo puede existir una PRIMARY KEY en una tabla, pero pueden haber más de un campo UNIQUE
  • Tanto una PRIMARY KEY como un campo UNIQUE pueden ser referenciados por una FOREIGN KEY

Lo copio textual desde la documentacion:

La creación de un índice único garantiza el fracaso de cualquier intento de duplicar valores de clave. No existen diferencias significativas entre crear una restricción UNIQUE y crear un índice único que es independiente de una restricción. La validación de datos se produce de igual modo y el optimizador de consultas no distingue entre un índice único creado mediante una restricción o creado manualmente. Sin embargo, debe crearse una restricción UNIQUE en la columna cuando el objetivo es la integridad de los datos. Esto deja claro el objetivo del índice.

Creo que mejor explicación no tiene 🙂

Manipular un identity de una columna con dbcc checkident

En este artículo chiquitito les contaré como manipular el valor de un campo con identity.

Hay una instrucción en T-SQL que se llama dbcc checkident  que sirve para manipular campos con identity, entre otras cosas, puede servir para resetear el contador (de una forma parecida que truncate, pero sin borrar datos).

Para este ejemplo, crearemos una tabla:


CREATE TABLE MiTable
(
id INT IDENTITY(1,1) NOT NULL,
fecha DATETIME NOT NULL
)

E insertaremos 3 valores

INSERT INTO MiTabla (fecha) VALUES (GETDATE())
INSERT INTO MiTabla (fecha) VALUES (GETDATE())
INSERT INTO MiTabla (fecha) VALUES (GETDATE())

Chequearemos con dbcc checkident el ultimo valor generado:
dbcc checkident('MiTabla',NORESEED)
Y debiera entregar algo más o menos así:

Checking identity information: current identity value ‘3’, current column value ‘3’.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Bien, sabemos el último elemento insertado es el 3 y el próximo será el 4. ¿Cómo lo hacemos para que el próximo elemento sea el 20? Fácil:
dbcc checkident('MiTabla',RESEED,19)
Debiera decir algo así:

Checking identity information: current identity value ‘3’.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

Ahora insertemos un valor más:
INSERT INTO MiTabla (fecha) VALUES (GETDATE())
Y consultamos por el ultimo valor:
SELECT TOP 1 * FROM MiTabla ORDER BY id DESC
Vemos que el id es 20.

Tomen nota que se toma el numero anterior al valor que queremos que se genere cuando se indica con dbcc checkident.

También funciona con valores negativos:
dbcc checkident('MiTabla',RESEED,-19)
Ahora insertemos un valor más:
INSERT INTO MiTabla (fecha) VALUES (GETDATE())
Y consultamos por el ultimo valor:
SELECT TOP 1 * FROM MiTabla ORDER BY id ASC
Vemos que el id es -18.

¡Chau!