Trước hết, vì bạn đang sử dụng SQL Server 2005, bạn nên đặt mã của mình có thể fail vào BEGIN TRY.....END TRY BEGIN CATCH....END CATCH
khối - thử / bắt khối cho T-SQL!
Thứ hai, đối với tất cả thao tác ngày tháng, tôi luôn luôn sử dụng định dạng ISO-8601 sẽ hoạt động bất kể định dạng ngày hiện tại được đặt trong SQL Server.
Định dạng ISO-8601 là YYYYMMDD
chỉ cho ngày tháng hoặc YYYY-MM-DDTHH:MM:SS
cho ngày tháng - vì vậy tôi sẽ viết mã của bạn là:
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
Không dựa vào bất kỳ định dạng ngày cụ thể nào đang được đặt !! Gửi cho tôi mã của bạn và tôi sẽ thử nó trên hệ thống Thụy Sĩ-Đức - tôi gần như đảm bảo rằng nó sẽ bị hỏng nếu bạn mù quáng cho rằng "en-US" và do đó "mm / dd / yyyy" - nó không cùng một bối cảnh ở mọi nơi trên hành tinh này.
Thật không may, SQL Server xử lý ngày tháng khá yếu - có thể đó có thể là một điểm mở rộng mà việc sử dụng cụm CLR bên trong SQL Server sẽ có ý nghĩa, để khai thác các chức năng xử lý ngày tháng phong phú hơn nhiều trong .NET ??
Marc
Tái bút:có vẻ như định dạng ISO-8601 mà tôi biết YYYY-MM-DD không phải lúc nào cũng hoạt động trong SQL Server - trái ngược với những gì Books Online dường như đã rao giảng. Thay vào đó, hãy sử dụng YYYYMMDD hoặc YYYY-MM-DDTHH:MM:SS.
Cảm ơn, gbn!