1

我正在升级应用程序以连接到 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 中的查询是否导致整个语句短路并且没有为变量赋值?

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

4

1 回答 1

1

我们的 DBA 与 Sybase 合作,此问题已被 Sybase 记录为一个错误:CR 742233,“在启用‘流线型动态 SQL’时,对变量赋值执行 isnull() 的查询可能返回 null。”</p>

解决方法是禁用“流线型动态 SQL”。

于 2013-06-27T19:02:28.363 回答