Pertama-tama, karena Anda menggunakan SQL Server 2005, Anda harus meletakkan kode yang mungkin gagal ke BEGIN TRY.....END TRY BEGIN CATCH....END CATCH
blok - coba/tangkap blok untuk T-SQL!
Kedua, untuk semua manipulasi tanggal, saya akan selalu gunakan format ISO-8601 yang akan berfungsi terlepas dari format tanggal saat ini yang diatur di SQL Server.
Format ISO-8601 adalah YYYYMMDD
hanya untuk tanggal, atau YYYY-MM-DDTHH:MM:SS
untuk tanggal dengan waktu - jadi saya akan menulis kode Anda sebagai:
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
Jangan bergantung pada format tanggal tertentu yang sedang diatur!! Kirimi saya kode Anda dan saya akan mencobanya pada sistem Swiss-Jerman - saya hampir menjamin itu akan rusak jika Anda secara membabi buta menganggap "en-US" dan dengan demikian "mm/dd/yyyy" - itu tidak pengaturan yang sama di mana-mana di planet ini.
Sayangnya SQL Server agak lemah menangani tanggal - mungkin itu mungkin titik ekstensi di mana menggunakan perakitan CLR di dalam SQL Server akan masuk akal, untuk memanfaatkan fungsi penanganan tanggal yang jauh lebih kaya di .NET ??
Marc
PS:sepertinya format ISO-8601 yang saya tahu YYYY-MM-DD tidak selalu berfungsi di SQL Server - bertentangan dengan apa yang sepertinya diberitakan oleh Books Online. Gunakan YYYYMMDD atau YYYY-MM-DDTHH:MM:SS sebagai gantinya.
Terima kasih, gbn!