Preciso escrever uma função para receber um caractere de string e retornar o formato da data. Por exemplo, a entrada é 20120101 e eu preciso deste 01-01-2012. O problema é que pode haver algumas entradas incorretas como esta "2012ABCD". Nesse caso, desejo que a função retorne uma data fixa, como 01-01 2020. O que eu escrevi até agora é:
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
Isso não funciona e eu simplesmente não sei como lidar com a segunda parte (quando a entrada está incorreta).
sql-server
t-sql
functions
Pantea Tourang
fonte
fonte
yyyymmdd
formato?Respostas:
No SQL Server 2012 e posterior, você pode usar TRY_CONVERT para verificar se a entrada pode ser convertida. Se não puder, um valor NULL será retornado; portanto, você poderá executar um COALESCE para obter o valor convertido ou a data fixa.
Você também pode usar um
TRY CATCH
bloco e retornar a data fixa noCATCH
bloco, mas é uma prática recomendada usar TRY_CONVERT para que o SQL Server não precise manipular um erro, pois isso requer mais tempo e recursos.Uma função para esse tipo de código acarretará mais sobrecarga do que simplesmente usar a mesma lógica na consulta; portanto, se ela for chamada muitas vezes a cada segundo, você poderá consumir recursos significativos usando uma função para ela. Eu entendo que isso pode ser chamado a partir de vários trechos de código, portanto, há um desejo de torná-lo uma função, caso a data padrão precise ser alterada - então não há alterações no código compilado e atualize essa função.
Se esse código for executado muito, considere outras opções que fornecerão melhor desempenho do que uma função definida pelo usuário. Consulte a resposta de Salomão para obter uma visão geral de suas opções e mais explicações sobre por que você pode escolher uma sobre a outra.
Por exemplo, o seguinte mostra a mesma lógica implementada como uma função com valor de tabela embutida, que precisa ser usada
CROSS APPLY
se não for fornecida com um valor estático, mas que tem um desempenho muito melhor que uma UDF escalar:fonte
FINALLY
bloco no T-SQL (acho que você quis dizerCATCH
). 2) você provavelmente deve mencionar queTRY_CONVERT
começou em 2012 (algumas pessoas estão paralisadas antes do SQL Server 2012). 3) você considerou um TVF em linha? Esses não têm os mesmos problemas de desempenho que os UDFs escalares.