Först och främst, eftersom du använder SQL Server 2005 bör du lägga in din kod som kan misslyckas med BEGIN TRY.....END TRY BEGIN CATCH....END CATCH
block - försök/fånga block för T-SQL!
För det andra, för all datummanipulation skulle jag alltid använd ISO-8601-format som fungerar oavsett vilket datumformat som är inställt i SQL Server.
ISO-8601-formatet är YYYYMMDD
för bara datum, eller YYYY-MM-DDTHH:MM:SS
för datum med tid - så jag skulle skriva din kod som:
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
Lita inte på att något speciellt datumformat ställs in!! Skicka mig din kod så ska jag prova den på ett schweizisk-tyskt system - jag garanterar nästan att den går sönder om du blint antar "en-US" och därmed "mm/dd/åååå" - det är det inte stark> samma miljö överallt på denna planet.
Tyvärr är SQL Server ganska svaga hanteringsdatum - kanske det kan vara en förlängningspunkt där det skulle vara meningsfullt att använda en CLR-sammansättning inuti SQL Server, för att utnyttja de mycket rikare datumhanteringsfunktionerna i .NET ??
Marc
PS:ISO-8601-formatet som jag visste ÅÅÅÅ-MM-DD verkar inte alltid fungera i SQL Server - i motsats till vad Books Online verkar predika. Använd ÅÅÅÅMMDD eller ÅÅÅÅ-MM-DDTHH:MM:SS istället.
Tack, se!