通过PROGRESS ODBC链接查询时,NULL日期替换为空值失败求助
我之前也碰到过类似Progress ODBC和SQL Server交互的坑,尤其是日期类型的处理,这玩意儿确实有点特殊。你用COALESCE、ISNULL这些函数没生效,大概率是因为Progress的日期存储/ODBC驱动的转换逻辑和SQL Server不一样,或者函数没有被正确下推到Progress端执行。给你几个可行的解决方案:
在Progress查询层面直接处理日期空值
因为Linked Server的很多SQL Server函数不会被推送到Progress数据库执行,而是把所有数据拉到本地后再处理。如果Progress里的“空日期”不是标准SQL的NULL(比如是Progress特有的空值标记,或者驱动自动转成了类似0000-00-00的无效字符串),本地的函数就识别不了。所以最好直接在Progress的查询里把空日期转成空字符串:declare @Data varchar(max) set @Data= N' SELECT MyCode, CASE WHEN MyDateField IS NULL OR MyDateField = '''' THEN '''' ELSE CAST(MyDateField AS VARCHAR(10)) END AS FormattedDate FROM TABLE ' exec (@Data ) AT PROGRESS;先判断日期字段是否为空,直接转成空字符串后再返回给SQL Server,避免后续的类型转换问题。
先转字符串再在本地处理空值
如果一定要在SQL Server端处理,可以先把Progress的日期字段转成字符串类型,再用COALESCE替换空值:-- 用OPENQUERY更直观,也能确保转换在Progress端完成 SELECT MyCode, COALESCE(DateStr, '') AS FormattedDate FROM OPENQUERY(PROGRESS, ' SELECT MyCode, CAST(MyDateField AS VARCHAR(10)) AS DateStr FROM TABLE ')把日期转成字符串后,NULL或者无效日期都会变成空字符串,本地的COALESCE就能正常工作了。
检查ODBC驱动的配置
有些Progress ODBC驱动会默认把NULL日期转换成一个无效的默认日期字符串(比如0000-00-00),这时候你在SQL Server里看到的就不是NULL,自然ISNULL这些函数没用。可以打开ODBC数据源管理器,找到你的Progress数据源,查看高级设置里有没有类似“Convert NULL Dates to Default”的选项,把它关掉,让驱动返回真正的NULL值。
另外,你可以先单独查询一下这个日期字段,看看返回的到底是NULL还是某个无效的日期字符串,比如执行:
exec (N' SELECT MyDateField FROM TABLE ') AT PROGRESS;
看结果里的空值到底是什么形式,这样能更精准地调整处理逻辑。
内容的提问来源于stack exchange,提问作者Katherine Pacheco

