我正在升级应用程序以连接到 Sybase ASE 15.7 数据库服务器而不是 12.5。当我切换它时,存储过程的行为发生了变化,这导致了应用程序出现问题。我将原因缩小到在过程中调用的 IsNull 函数。
我发现在 15.7 上单独运行 IsNull 可以正常工作:
select IsNull((SELECT 9 WHERE 5 != 5),-1) -- returns -1
但是,尝试将返回值分配给变量不起作用:
DECLARE @key_clnt_id_n int
SELECT @key_clnt_id_n = IsNull((SELECT 9 WHERE 5 != 5),-1)
select @key_clnt_id_n -- returns blank
添加'from table'子句使其工作:
declare @eff_d datetime
select @eff_d = IsNull((select '09/09/1990' from db_table db WHERE 5!=5),'01/01/1800')
select @eff_d -- returns '01/01/1800'
但是删除 'from table' 子句会破坏它:
declare @eff_d datetime
select @eff_d = IsNull((select '09/09/1990' WHERE 5!=5),'01/01/1800')
select @eff_d -- returns blank
最后,在执行之前打开 COMPATIBLITY_MODE 也可以修复它:
declare @eff_d datetime
SET COMPATIBILITY_MODE ON
select @eff_d = IsNull((select '09/09/1990' WHERE 5!=5),'01/01/1800')
SET COMPATIBILITY_MODE OFF
select @eff_d -- returns '01/01/1800'
导致此问题的 15.7 数据库中发生了什么?IsNull 中的查询是否导致整个语句短路并且没有为变量赋值?
还有其他方法可以确保设置变量吗?