在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/