Da Sie SQL Server 2005 verwenden, sollten Sie zuallererst Ihren Code so einfügen, dass vielleicht scheitern an BEGIN TRY.....END TRY BEGIN CATCH....END CATCH
blocks - try/catch-Blöcke für T-SQL!
Zweitens würde ich bei aller Datumsmanipulation immer Verwenden Sie das ISO-8601-Format, das unabhängig davon funktioniert, welches aktuelle Datumsformat in SQL Server eingestellt ist.
Das ISO-8601-Format ist YYYYMMDD
für nur Daten oder YYYY-MM-DDTHH:MM:SS
für Datum mit Uhrzeit - also würde ich Ihren Code schreiben als:
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
Verlassen Sie sich nicht darauf, dass ein bestimmtes Datumsformat eingestellt ist!! Schicken Sie mir Ihren Code und ich probiere ihn auf einem schweizerisch-deutschen System aus - ich garantiere fast, dass er kaputt geht, wenn Sie blindlings "en-US" und damit "mm/dd/yyyy" annehmen - es ist nicht die gleiche Einstellung überall auf diesem Planeten.
Leider ist SQL Server ziemlich schwach im Umgang mit Datumsangaben - vielleicht könnte das ein Erweiterungspunkt sein, an dem die Verwendung einer CLR-Assembly innerhalb von SQL Server sinnvoll wäre, um die viel umfangreicheren Datumshandhabungsfunktionen in .NET zu erschließen ??
Markus
PS:Das ISO-8601-Format, von dem ich wusste, dass YYYY-MM-DD nicht immer in SQL Server funktioniert - im Gegensatz zu dem, was Books Online zu predigen scheint. Verwenden Sie stattdessen JJJJMMTT oder JJJJ-MM-TTTHH:MM:SS.
Danke, gbn!