Za prvé, protože používáte SQL Server 2005, měli byste vložit svůj kód, který může nezdaří se BEGIN TRY.....END TRY BEGIN CATCH....END CATCH
bloky - zkuste/chytněte bloky pro T-SQL!
Zadruhé, pro veškerou manipulaci s datem bych vždy použijte formát ISO-8601, který bude fungovat bez ohledu na to, jaký aktuální formát data je nastaven na serveru SQL.
Formát ISO-8601 je YYYYMMDD
pouze pro data nebo YYYY-MM-DDTHH:MM:SS
pro datum s časem - takže bych váš kód napsal jako:
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
Nespoléhejte na to, že bude nastaven nějaký konkrétní formát data!! Pošlete mi svůj kód a já ho vyzkouším na švýcarsko-německém systému – téměř garantuji, že se rozbije, pokud budete slepě předpokládat „en-US“ a tedy „mm/dd/yyyy“ – není silný> stejné nastavení všude na této planetě.
Bohužel SQL Server zpracovává data poměrně slabě – možná by to mohl být bod rozšíření, kde by použití sestavení CLR uvnitř SQL Serveru dávalo smysl, aby bylo možné využít mnohem bohatší funkce zpracování dat v .NET ??
Marc
PS:Zdá se, že formát ISO-8601, který jsem znal, RRRR-MM-DD ne vždy funguje na serveru SQL Server – na rozdíl od toho, co káže Books Online. Místo toho použijte RRRRMMDD nebo RRRR-MM-DDTHH:MM:SS.
Díky, gbn!