Archivos de la categoría: T-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 🙂

Diferencia entre GRANT y WITH GRANT OPTION

Para conceder permisos sobre objetos a usuarios o roles en una base de datos, es necesario usar la instruccion GRANT.
Por ejemplo, para concederle permiso de SELECT al usuario pepito sobre la tabla cliente lo hacemos así:
GRANT SELECT ON cliente TO pepito
Pero si queremos que pepito le pueda otorgar el mismo privilegio de SELECT a otros usuarios, usamos WITH GRANT OPTION
:
GRANT SELECT ON cliente TO pepito WITH GRANT OPTION

Para resumir: GRANT se utiliza para otorgrar privilegios sobre objetos a usuarios y roles. WITH GRANT OPTION se utiliza para que el mismo usuario pueda otorgrar el mismo privilegio sobre el mismo objeto a otros usuarios o roles.

¡Chau!