Мне нужно написать функцию, чтобы получить символ строки и вернуть формат даты. Например, ввод 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
t-sql
functions
Пантеа Туранг
источник
источник
yyyymmdd
формата?Ответы:
В SQL Server 2012 и более поздних версиях вы можете использовать TRY_CONVERT, чтобы проверить, можно ли преобразовать входные данные. Если это невозможно, возвращается значение NULL, поэтому вы можете выполнить COALESCE, чтобы получить либо преобразованное значение, либо фиксированную дату.
Вы также можете использовать
TRY CATCH
блок и вернуть фиксированную дату вCATCH
блоке, но рекомендуется использовать TRY_CONVERT, чтобы SQL Server не обрабатывал ошибку, поскольку это требует больше времени и ресурсов.Функция для этого типа кода будет сопряжена с большими издержками, чем просто использование одной и той же логики в запросе, поэтому, если она вызывается много раз каждую секунду, вы можете потратить значительный ресурс, используя для него функцию. Я понимаю, что это может быть вызвано из множества кусков кода, поэтому есть желание сделать его функцией в случае, если нужно изменить дату по умолчанию - тогда скомпилированный код не изменится, а просто обновите эту функцию.
Если этот код будет выполняться много, вы должны рассмотреть другие варианты, которые обеспечат лучшую производительность, чем пользовательская функция. Пожалуйста, смотрите ответ Соломона для обзора ваших вариантов и дальнейшего объяснения того, почему вы можете выбрать один из других.
Например, ниже показана та же логика, реализованная в виде встроенной табличной функции, которую необходимо использовать,
CROSS APPLY
если она не снабжена статическим значением, но работает намного лучше, чем скалярный UDF:источник
FINALLY
в T-SQL нет блока (думаю, вы имели в видуCATCH
). 2) Вы, вероятно, должны упомянуть, чтоTRY_CONVERT
началось в 2012 году (некоторые люди застряли до SQL Server 2012). 3) вы рассматривали Inline TVF? У них нет таких проблем с производительностью, как у скалярных UDF.