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がより多くの時間とリソースを必要とするエラーを処理する必要がないようにすることをお勧めします。
このタイプのコードの関数は、クエリで同じロジックを使用するよりもオーバーヘッドが大きくなるため、毎秒何度も呼び出される場合は、関数を使用して大量のリソースを消費する可能性があります。これは多数のコードから呼び出される可能性があることを理解しているため、デフォルトの日付を変更する必要がある場合に備えて関数にしたいという願望があります。コンパイルされたコードの変更ではなく、この関数を更新するだけです。
このコードが頻繁に実行される場合は、ユーザー定義関数よりも優れたパフォーマンスを提供する他のオプションを検討する必要があります。オプションの概要と、他のオプションを選択する理由の詳細については、ソロモンの回答を参照してください。
たとえば、次の例は、インラインテーブル値関数として実装された同じロジックを示しています。これはCROSS APPLY
、静的な値が指定されていない場合に使用する必要がありますが、スカラー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
*/