2013-06-26 68 views
1

我正在升級應用程序以連接到Sybase ASE 15.7數據庫服務器而不是12.5。當我切換時,存儲過程的行爲發生了改變,導致應用程序出現問題。我將原因縮小到在程序中被調用的IsNull函數。Sybase 12.5和15.7之間的IsNull表現不同15

我發現自身的運行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 

添加「從表'子句使其工作:

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' 

但刪除'從表'子句打破它:

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

我們的數據庫管理員與Sybase工作,這個問題已被記錄爲被Sybase錯誤:CR 742233「查詢在變量賦值語句執行ISNULL()的時候‘精簡的動態SQL’啓用可能返回null。」

解決方法是禁用「簡化的動態SQL」。

相關問題