Прежде всего, поскольку вы используете 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» и, следовательно, «мм / дд / гггг» - это не одинаковые настройки повсюду на этой планете.
К сожалению, SQL Server довольно слабо обрабатывает даты - может быть, это может быть точкой расширения, где использование CLR-сборки внутри SQL Server имеет смысл, чтобы использовать гораздо более богатые функции обработки дат в .NET ??
Марк
PS: кажется, что формат ISO-8601, который я знал, YYYY-MM-DD не всегда работает в SQL Server - вопреки тому, что, похоже, проповедует Books Online. Вместо этого используйте ГГГГММДД или ГГГГ-ММ-ДДТЧ: ММ: СС.
Спасибо, ГБН!