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中的查詢是否導致整個語句短路並且不爲變量賦值?
是否有其他方法可以確保變量設置?