Sql-Server

接收字元輸入並返回日期格式的函式(輸入不正確)

  • June 28, 2020

我需要編寫一個函式來接收字元串字元並返回日期格式。例如輸入是 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 APPLYif 不提供靜態值一起使用,但性能比標量 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
*/

引用自:https://dba.stackexchange.com/questions/236872