Først og fremmest, da du bruger SQL Server 2005, bør du indsætte din kode, der måske mislykkes i BEGIN TRY.....END TRY BEGIN CATCH....END CATCH
blokke - prøv/fang blokke til T-SQL!
For det andet, for al datemanipulation, ville jeg altid brug ISO-8601-format, som vil fungere, uanset hvilket aktuelle datoformat der er indstillet i SQL Server.
ISO-8601-formatet er YYYYMMDD
kun for datoer, eller YYYY-MM-DDTHH:MM:SS
for dato med tid - så jeg ville skrive din kode 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
Stol ikke på, at et bestemt datoformat bliver sat!! Send mig din kode, så prøver jeg den på et schweizisk-tysk system - jeg garanterer næsten, at den går i stykker, hvis du blindt antager "en-US" og dermed "mm/dd/åååå" - det er ikke stærk> den samme indstilling overalt på denne planet.
Desværre er SQL Server temmelig svage håndteringsdatoer - det kan måske være et udvidelsespunkt, hvor det ville være fornuftigt at bruge en CLR-assembly inde i SQL Server til at udnytte de meget rigere datohåndteringsfunktioner i .NET ??
Marc
PS:Det ser ud til, at ISO-8601-formatet, jeg vidste, ÅÅÅÅ-MM-DD ikke altid virker i SQL Server - i modsætning til hvad Books Online synes at prædike. Brug ÅÅÅÅMMDD eller ÅÅÅÅ-MM-DDTHH:MM:SS i stedet.
Tak, gbn!