Necesito escribir una función para recibir un carácter de cadena y devolver el formato de fecha. Por ejemplo, la entrada es 20120101 y necesito esta 2012-01-01. El problema es que puede haber algunas entradas incorrectas como esta "2012ABCD". En ese caso, quiero que la función devuelva una fecha fija como 2020-01-01. Lo que he escrito hasta ahora es:
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
Esto no funciona y simplemente no sé cómo manejar la segunda parte (cuando la entrada es incorrecta).
sql-server
t-sql
functions
Pantea Tourang
fuente
fuente
yyyymmdd
formato?Respuestas:
En SQL Server 2012 y versiones posteriores, puede usar TRY_CONVERT para verificar si la entrada se puede convertir. Si no puede, se devuelve un valor NULL para que pueda hacer una COALESCE para obtener el valor convertido o la fecha fija.
También puede usar un
TRY CATCH
bloque y devolver la fecha fija en elCATCH
bloque, pero es una buena práctica usar TRY_CONVERT para que SQL Server no tenga que manejar un error, ya que requiere más tiempo y recursos.Una función para este tipo de código generará más sobrecarga que simplemente usar la misma lógica en la consulta, por lo tanto, si se llama muchas veces por segundo, puede absorber un recurso significativo al usar una función para ello. Entiendo que esto se puede invocar desde numerosas piezas de código, por lo que existe el deseo de que sea una función en caso de que la fecha predeterminada deba cambiarse; entonces no se trata de cambios en el código compilado y solo actualice esta función.
Si este código se va a ejecutar mucho, debe considerar otras opciones que proporcionarán un mejor rendimiento que una función definida por el usuario. Consulte la respuesta de Salomón para obtener una descripción general de sus opciones y una explicación más detallada de por qué podría elegir una sobre la otra.
Por ejemplo, a continuación se muestra la misma lógica implementada como una función en línea con valores de tabla, que debe usarse
CROSS APPLY
si no se proporciona un valor estático, pero funciona mucho mejor que un UDF escalar:fuente
FINALLY
bloque en T-SQL (creo que quisiste decirCATCH
). 2) probablemente debería mencionar queTRY_CONVERT
comenzó en 2012 (algunas personas están estancadas antes de SQL Server 2012). 3) ¿ ha considerado un TVF en línea? Esos no tienen los mismos problemas de rendimiento que los UDF escalares.