Po pierwsze, ponieważ używasz SQL Server 2005, powinieneś umieścić swój kod, który może nie powiodło się w BEGIN TRY.....END TRY BEGIN CATCH....END CATCH
bloki - spróbuj/złap bloki dla T-SQL!
Po drugie, przy wszystkich manipulacjach datami zawsze użyj formatu ISO-8601, który będzie działał niezależnie od bieżącego formatu daty ustawionego w SQL Server.
Format ISO-8601 to YYYYMMDD
dla samych dat lub YYYY-MM-DDTHH:MM:SS
dla daty z godziną - więc napisałbym twój kod jako:
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
Nie polegaj na ustawianiu żadnego konkretnego formatu daty!! Wyślij mi swój kod, a wypróbuję go w systemie szwajcarsko-niemieckim – prawie gwarantuję, że się zepsuje, jeśli ślepo założysz „en-US”, a więc „mm/dd/rrrr” – to nie to samo ustawienie na całym świecie.
Niestety SQL Server jest raczej słaby w obsłudze dat - może to może być punkt rozszerzenia, w którym użycie zestawu CLR wewnątrz SQL Server miałoby sens, aby skorzystać z dużo bogatszych funkcji obsługi dat w .NET ??
Marek
PS:wygląda na to, że format ISO-8601, o którym wiedziałem, RRRR-MM-DD nie zawsze działa w SQL Server - w przeciwieństwie do tego, co głosi Books Online. Zamiast tego użyj RRRRMMDD lub RRRR-MM-DDTHH:MM:SS.
Dziękujemy, gbn!