IsNull在Sybase 12.5和15.7之间的行为有所不同

时间:2013-06-26 19:58:16

标签: sybase sybase-ase isnull

我正在升级应用程序以连接到Sybase ASE 15.7数据库服务器而不是12.5。当我将其切换时,存储过程的行为发生了变化,从而导致应用程序出现问题。我将原因缩小到在过程中调用的IsNull函数。

我发现运行IsNull在15.7上运行正常:

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中的查询是否导致整个语句短路并且没有为变量赋值?

还有其他方法可以确保变量设置好吗?

1 个答案:

答案 0 :(得分:1)

我们的DBA与Sybase合作,这个问题已被Sybase记录为错误:CR 742233,“在启用'简化动态SQL'时,对变量赋值执行isnull()的查询可能会返回null。”

解决方法是禁用“简化的动态SQL”。