Allereerst, aangezien u SQL Server 2005 gebruikt, moet u uw code plaatsen die misschien mislukken in BEGIN TRY.....END TRY BEGIN CATCH....END CATCH
blokken - probeer/vang blokken voor T-SQL!
Ten tweede zou ik voor alle datummanipulaties altijd gebruik de ISO-8601-indeling die werkt ongeacht de huidige datumindeling in SQL Server.
ISO-8601-indeling is YYYYMMDD
voor alleen data, of YYYY-MM-DDTHH:MM:SS
voor datum met tijd - dus ik zou je code schrijven 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
Vertrouw niet op het instellen van een bepaald datumformaat!! Stuur me je code en ik probeer het op een Zwitsers-Duits systeem - ik garandeer je bijna dat het zal breken als je blindelings "en-US" en dus "mm/dd/yyyy" aanneemt - het is niet overal op deze planeet dezelfde instelling.
Helaas is SQL Server nogal zwak voor het verwerken van datums - misschien is dat een uitbreidingspunt waar het gebruik van een CLR-assembly in SQL Server logisch zou zijn, om gebruik te maken van de veel rijkere datumverwerkingsfuncties in .NET ??
Marc
PS:lijkt het ISO-8601-formaat waarvan ik wist dat JJJJ-MM-DD niet altijd werkt in SQL Server - in tegenstelling tot wat Books Online lijkt te prediken. Gebruik in plaats daarvan JJJJMMDD of JJJJ-MM-DDTHH:MM:SS.
Bedankt, gbn!