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
있지만 SQL Server에서 더 많은 시간과 리소스가 필요하므로 오류를 처리하지 않도록 TRY_CONVERT를 사용하는 것이 가장 좋습니다.
이 유형의 코드에 대한 함수는 쿼리에서 동일한 논리를 사용하는 것보다 더 많은 오버 헤드를 발생 시키므로 매초마다 여러 번 호출되는 경우 함수를 사용하여 중요한 리소스를 씹을 수 있습니다. 나는 이것이 많은 코드 조각에서 호출 될 수 있다는 것을 이해하므로 기본 날짜를 변경해야 할 경우에 함수로 만들고 싶습니다. 그런 다음 컴파일 된 코드가 변경되지 않고이 함수를 업데이트하십시오.
이 코드가 많이 실행될 경우 사용자 정의 함수보다 더 나은 성능을 제공하는 다른 옵션을 고려해야합니다. 선택 사항 에 대한 개요와 왜 다른 것을 선택할 수 있는지에 대한 자세한 설명 은 Solomon의 답변 을 참조하십시오 .
예를 들어, 다음은 인라인 테이블 반환 함수로 구현 된 것과 동일한 논리를 보여줍니다.이 함수 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
*/