На първо място, тъй като използвате SQL Server 2005, трябва да поставите своя код, който може неуспешно в BEGIN TRY.....END TRY BEGIN CATCH....END CATCH
блокове - изпробвайте/улавяйте блокове за T-SQL!
Второ, за всички манипулации на дати, бихвинаги използвайте формат ISO-8601, който ще работи независимо от това какъв формат на текущата дата е зададен в SQL Server.
Форматът ISO-8601 е YYYYMMDD
само за дати или YYYY-MM-DDTHH:MM:SS
за дата с час - така че ще напиша вашия код като:
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
Не разчитайте на зададен определен формат за дата!! Изпратете ми кода си и ще го пробвам на швейцарско-германска система - почти гарантирам, че ще се счупи, ако сляпо приемете "en-US" и по този начин "mm/dd/yyyy" - това е не силно> една и съща настройка навсякъде на тази планета.
За съжаление SQL Server е доста слаб за обработка на дати – може би това може да е точка на разширение, където използването на CLR сборка в SQL Server би имало смисъл, за да се възползвате от много по-богатите функции за обработка на дати в .NET??
Марк
PS:Изглежда, че форматът ISO-8601, който знаех, ГГГГ-ММ-ДД, не винаги работи в SQL Server - противно на това, което изглежда проповядва Books Online. Вместо това използвайте YYYYMMDD или YYYY-MM-DDTHH:MM:SS.
Благодаря, gbn!