Sql-Server
接收字元輸入並返回日期格式的函式(輸入不正確)
我需要編寫一個函式來接收字元串字元並返回日期格式。例如輸入是 20120101,我需要這個 2012-01-01。問題是可能有一些不正確的輸入,例如“2012ABCD”。在這種情況下,我希望該函式返回一個修復日期,例如 2020-01-01。到目前為止我寫的是:
Create Function ReturnDate (@date varchar(8)) Returns date as begin declare @result date set @result = (select convert(date , @date,111)) if(@@ROWCOUNT>0) return @result else return '2020-01-01' return @result end
這不起作用,我只是不知道如何處理第二部分(當輸入不正確時)。
在 SQL Server 2012 及更高版本上,您可以使用TRY_CONVERT檢查輸入是否可以轉換。如果不能,則返回 NULL 值,然後您可以執行 COALESCE 以獲取轉換後的值或固定日期。
begin declare @result date set @result = COALESCE(TRY_CONVERT(date, @date, 111), '2012-01-01') return @result end
您也可以使用
TRY CATCH
塊並在塊中返回固定日期CATCH
,但最佳做法是使用 TRY_CONVERT 以便 SQL Server 不必處理錯誤,因為這需要更多時間和資源。與在查詢中簡單地使用相同的邏輯相比,此類程式碼的函式會產生更多的成本,因此如果每秒多次呼叫它,您可能會通過使用函式來消耗大量資源。我知道這可能是從大量程式碼中呼叫的,因此希望在需要更改預設日期的情況下使其成為一個函式 - 然後它沒有編譯程式碼更改,只需更新此函式。
如果此程式碼要大量執行,您應該考慮其他選項,這些選項將提供比使用者定義函式更好的性能。請參閱Solomon 的回答,了解您的選項概述,並進一步解釋為什麼您可能會選擇其中一個。
例如,以下顯示了作為內聯表值函式實現的相同邏輯,它需要與
CROSS APPLY
if 不提供靜態值一起使用,但性能比標量 UDF 好得多:USE [tempdb]; GO CREATE OR ALTER -- comment out if using pre-SQL Server 2016 SP1 FUNCTION dbo.ReturnDate (@Date VARCHAR(8)) RETURNS TABLE AS RETURN SELECT ISNULL(TRY_CONVERT(DATE, @Date, 111), '2020-01-01') AS [TheDate]; GO SELECT * FROM (VALUES (1, '20120101'), (2, '2012ABCD')) tab(ID, Input) CROSS APPLY dbo.ReturnDate(tab.[Input]) dt /* ID Input TheDate 1 20120101 2012-01-01 2 2012ABCD 2020-01-01 */