在SQL 2000數據庫裡的自定義函數中調用GETDATE()時,結果編譯時報錯,提示錯誤如下:Invalid use of 'getdate' within a function
我給個測試例子如下所示,
--================================================================================================ -- Author : Kerry -- CreateDate : 2011-03-23 -- Description : 根據規則自動生成流水號 -------------------------------------------------------------------------------------------------- -- UpdateDate : -------------------------------------------------------------------------------------------------- CREATEPROCEDURE USP_RiminSampleNoGenerate @TypeVARCHAR(10) AS SET NOCOUNT ON; DECLARE@SampleNoASVARCHAR(30); DECLARE@DateASVARCHAR(8); DECLARE@SerialNumberASVARCHAR(3) BEGIN SELECT@Date=CONVERT(VARCHAR(18),GETDATE(), 112); --業務規則處理 END GO
如果你把GETDATE() 改成dbo.GETDATE()則編譯不會出錯,但是調用該函數時會報錯,錯誤提示如下所示:對象名 'dbo.GETDATE '
無效。
這是因為不允許在用戶定義函數主體中內置不確定函數(確定性函數和不確定性函數大家可以參考MSDN文檔介紹)。在SQL 2000裡面有
兩種解決方案:把GETDATE()函數作為自定義函數的參數傳入(如下所示)或定義獲得當前時間的視圖來解決這個問題。GETDATE()是不確
定函數。不過似乎在SQL 2005裡面,自定義函數可以調用函數GETDATE(),如下所示,而且編譯、調用時都不會出錯。
--============================================================================================== -- Author : Kerry -- CreateDate : 2011-03-23 -- Description : 根據規則自動生成流水號 ------------------------------------------------------------------------------------------------ -- UpdateDate : ------------------------------------------------------------------------------------------------ CREATEFUNCTION[dbo].[FUN_GenerateRaminiSampleNo](@TypeVARCHAR(10), @DateTimeDATETIME) RETURNSVARCHAR(30) AS BEGIN DECLARE@SampleNoVARCHAR(30); DECLARE@DateVARCHAR(8); DECLARE@SerialNumberVARCHAR(3); SELECT@Date=CONVERT(VARCHAR(8),GETDATE(), 112); --編譯出錯 --SELECT @Date = CONVERT(VARCHAR(8),dbo.GETDATE(), 112); --調用出錯 --SELECT @Date = CONVERT(VARCHAR(8), @DateTime, 112); --業務規則 END GO
作者:潇湘隱者
出處:http://www.cnblogs.com/kerrycode/