我有一个 etl 项目,其中源有 60 个 datetime2 列,目标完全是 datetime。
几天前,我们醒来时发现一个空的数据仓库,因为一家医院的一位用户为一位患者输入了“1220-01-01”的手术日期。
我通过在自定义函数中整理每一列暂时解决了这个问题:
ALTER function [dbo].[scrub_datetime2](@date datetime2)
returns date
as
begin
declare @return date
set @return = case when @date <= '1800-01-01' then null else @date end
return @return
end
这可以消除红色文本,但它也使作业运行的时间增加了一倍。我很高兴尽自己的一份力,让服务器机房里的仓鼠在圣诞节期间保持温暖,但我真的不能证明为此问题浪费了 2.5 小时宝贵的通宵时间。
问题如何最有效地检查 datetime2 值是否适合日期时间?
您应该使用 TRY_CONVERT 函数Docs
如果值不正确,它将返回 null
如果您使用的是 SQL Server 2012 或更高版本,并且您的数据库的兼容性级别为 110 或更高,则可以使用
TRY_CONVERT
.如果没有,用内联表值函数代替标量值函数应该会有所帮助。