Em primeiro lugar, como você está usando o SQL Server 2005, você deve colocar seu código que pode falha em
BEGIN TRY.....END TRY BEGIN CATCH....END CATCH
blocos - blocos try/catch para T-SQL! Segundo, para todas as manipulações de datas, eu sempre use o formato ISO-8601 que funcionará independentemente do formato de data atual definido no SQL Server.
O formato ISO-8601 é
YYYYMMDD
apenas para datas ou YYYY-MM-DDTHH:MM:SS
para data com hora - então eu escreveria seu 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
Não confie em nenhum formato de data específico sendo definido! Envie-me seu código e eu vou testá-lo em um sistema suíço-alemão - eu quase garanto que ele vai quebrar se você assumir cegamente "en-US" e, portanto, "mm/dd/aaaa" - não forte> a mesma configuração em todos os lugares deste planeta.
Infelizmente, o SQL Server é bastante fraco para lidar com datas - talvez isso possa ser um ponto de extensão em que o uso de um assembly CLR dentro do SQL Server faria sentido, para explorar as funções de manipulação de data muito mais ricas no .NET ??
Marco
PS:parece que o formato ISO-8601 que eu sabia que YYYY-MM-DD nem sempre funciona no SQL Server - ao contrário do que os Books Online parecem pregar. Use YYYYMMDD ou YYYY-MM-DDTHH:MM:SS.
Obrigado, gbn!