En primer lugar, dado que está utilizando SQL Server 2005, debe poner su código que podría falla en BEGIN TRY.....END TRY BEGIN CATCH....END CATCH
bloques - ¡intentar/atrapar bloques para T-SQL!
En segundo lugar, para toda manipulación de fechas, siempre use el formato ISO-8601 que funcionará independientemente del formato de fecha actual establecido en SQL Server.
El formato ISO-8601 es YYYYMMDD
solo para fechas, o YYYY-MM-DDTHH:MM:SS
para fecha con hora, entonces escribiría su código como:
BEGIN TRY
SET @Source='07152009'
SET @Temp = RIGHT(@Source, 4) + -- YYYY
LEFT(@Source, 2) + -- MM
SUBSTRING(@Source, 3, 2) -- DD
IF ISDATE(@Temp)!=1
BEGIN
RAISERROR('ERROR, invalid date',16,1)
END
SET @Destination = CAST(@Temp AS DATETIME)
END TRY
BEGIN CATCH
-- handle error if something bombs out
END CATCH
¡No confíe en que se establezca ningún formato de fecha en particular! Envíeme su código y lo probaré en un sistema suizo-alemán. Casi le garantizo que se romperá si asume ciegamente "en-US" y, por lo tanto, "mm/dd/yyyy". No. fuerte> el mismo escenario en todas partes de este planeta.
Desafortunadamente, SQL Server es bastante débil en el manejo de fechas; tal vez ese podría ser un punto de extensión en el que tendría sentido usar un ensamblaje CLR dentro de SQL Server, para aprovechar las funciones de manejo de fechas mucho más ricas en .NET ??
Marc
PD:parece que el formato ISO-8601 que sabía YYYY-MM-DD no siempre funciona en SQL Server, al contrario de lo que parece predicar Books Online. Use AAAAMMDD o AAAA-MM-DDTHH:MM:SS en su lugar.
¡Gracias, gbn!