項目里客戶端突然報錯,原因是SQL Server中某個Function返回值有問題,拿來代碼看還是比較簡單的Function,雖然寫法很不好,但是select dbo.fn_xxxfunction(0)返回值是空就有點奇怪。 IF OBJECT_ID('fn_xxxfunction', 'FN') ...
項目里客戶端突然報錯,原因是SQL Server中某個Function返回值有問題,拿來代碼看還是比較簡單的Function,雖然寫法很不好,但是select dbo.fn_xxxfunction(0)
返回值是空就有點奇怪。
IF OBJECT_ID('fn_xxxfunction', 'FN') IS NOT NULL
DROP FUNCTION dbo.fn_xxxfunction
GO
CREATE FUNCTION fn_xxxfunction
(
@Rec INT
)
RETURNS NVARCHAR(10)
AS
BEGIN
IF @Rec = 0 RETURN 'AAAAAAAAAA' ELSE IF @Rec = 1 RETURN 'BBBBBBBBBB'
RETURN ''
END
GO
同項目組跑的都是一套代碼沒有問題說明可能是資料庫本身問題,想起來前幾天把資料庫相容性改到SQL Server 2019了,降級到2017發現就沒問題了。
試了一下轉返回值類型,但是還是返回空。
IF @Rec = 0 RETURN CAST('AAAAAAAAAA' AS NVARCHAR(10)) ELSE IF @Rec = 1 RETURN CAST('BBBBBBBBBB' AS NVARCHAR(10))
把預設返回值類型改了就對了
RETURN CAST('' AS NVARCHAR(10))
理論上其實更標準肯定是
IF OBJECT_ID('fn_xxxfunction', 'FN') IS NOT NULL
DROP FUNCTION dbo.fn_xxxfunction
GO
CREATE FUNCTION fn_xxxfunction
(
@Rec INT
)
RETURNS NVARCHAR(10)
AS
BEGIN
DECLARE @Returns NVARCHAR(10)
IF @Rec = 0
SET @Returns = N'AAAAAAAAAA'
ELSE IF @Rec = 1
SET @Returns = N'BBBBBBBBBB'
ELSE SET @Returns = N''
RETURN @Returns
END
GO
但是理論上Function在創建的時候就規定了返回值的類型,Function內的預設返回值不應該反過來影響到Function創建時規定的返回值類型,感覺不知道這個是新特性還是BUG,目前就先改下以前不好的寫法。