Prima di tutto, dato che stai usando SQL Server 2005, dovresti inserire il tuo codice che potrebbe fallisci in BEGIN TRY.....END TRY BEGIN CATCH....END CATCH
blocchi - prova/cattura blocchi per T-SQL!
Secondo, per tutte le manipolazioni della data, lo farei sempre usa il formato ISO-8601 che funzionerà indipendentemente dal formato della data corrente impostato in SQL Server.
Il formato ISO-8601 è YYYYMMDD
solo per le date o YYYY-MM-DDTHH:MM:SS
per data e ora, quindi scriverei il tuo codice come:
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
Non fare affidamento sull'impostazione di un particolare formato di data !! Mandami il tuo codice e lo proverò su un sistema svizzero-tedesco - ti garantisco quasi che si romperà se assumi ciecamente "en-US" e quindi "mm/gg/aaaa" - non la stessa impostazione ovunque su questo pianeta.
Sfortunatamente SQL Server è piuttosto debole per la gestione delle date, forse questo potrebbe essere un punto di estensione in cui avrebbe senso utilizzare un assembly CLR all'interno di SQL Server, per sfruttare le funzioni di gestione della data molto più ricche in .NET??
Marco
PS:sembra che il formato ISO-8601 che sapevo AAAA-MM-GG non funziona sempre in SQL Server, contrariamente a quanto sembra predicare la documentazione in linea. Usa invece AAAAMMGG o AAAA-MM-GGTHH:MM:SS.
Grazie, GBN!