SQL Server 2012 ve sonraki sürümlerde girdinin dönüştürülebilir olup olmadığını kontrol etmek için TRY_CONVERT kullanabilirsiniz . Bu yapılamazsa, NULL değeri döndürülür, böylece dönüştürülen değeri veya sabit tarihi almak için bir COALESCE yapabilirsiniz.
begin
declare @result date
set @result = COALESCE(TRY_CONVERT(date, @date, 111), '2012-01-01')
return @result
end
Ayrıca bir TRY CATCH
blok kullanabilir ve blokta sabit tarihi döndürebilirsiniz CATCH
, ancak en iyi uygulama TRY_CONVERT kullanmaktır, böylece SQL Server daha fazla zaman ve kaynak gerektirdiği için bir hatayı işlemek zorunda kalmaz.
Bu tür bir kod için bir işlev, sorguda aynı mantığı kullanmaktan daha fazla yüke neden olur, bu nedenle her saniye birçok kez çağrılırsa, bunun için bir işlev kullanarak önemli kaynakları çiğneyebilirsiniz. Bu, çok sayıda kod parçasından çağrılabilir, bu nedenle varsayılan tarihin değiştirilmesi gerektiğinde bir işlev yapma arzusu olduğunu anlıyorum - o zaman derlenmiş kod değişikliği yok ve sadece bu işlevi güncelleyin.
Bu kod çok çalıştırılacaksa, kullanıcı tanımlı bir işlevden daha iyi performans sağlayacak diğer seçenekleri göz önünde bulundurmalısınız. Seçeneklerinize genel bir bakış ve neden birini diğerine tercih edebileceğinizle ilgili daha fazla açıklama için lütfen Solomon'un cevabına bakın .
Örneğin, aşağıda, CROSS APPLY
statik bir değer sağlanmadığı takdirde kullanılması gereken , ancak skaler UDF'den çok daha iyi performans gösteren satır içi tablo değerli bir işlev olarak uygulanan aynı mantık gösterilmektedir :
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
*/