我正在升级应用程序以连接到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中的查询是否导致整个语句短路并且没有为变量赋值?
还有其他方法可以确保变量设置好吗?
答案 0 :(得分:1)
我们的DBA与Sybase合作,这个问题已被Sybase记录为错误:CR 742233,“在启用'简化动态SQL'时,对变量赋值执行isnull()的查询可能会返回null。”
解决方法是禁用“简化的动态SQL”。