Welcome

首页 / 数据库 / SQLServer / SQL 2000自定义函数调用GETDATE()时报错

SQL 2000自定义函数调用GETDATE()时报错2015-02-18在SQL 2000数据库里的自定义函数中调用GETDATE()时,结果编译时报错,提示错误如下:Invalid use of "getdate" within a function

我给个测试例子如下所示,

--================================================================================================-- Author : Kerry-- CreateDate : 2011-03-23-- Description : 根据规则自动生成流水号---------------------------------------------------------------------------------------------------- UpdateDate :--------------------------------------------------------------------------------------------------CREATEPROCEDURE USP_RiminSampleNoGenerate@TypeVARCHAR(10)ASSET NOCOUNT ON;DECLARE@SampleNoASVARCHAR(30);DECLARE@DateASVARCHAR(8);DECLARE@SerialNumberASVARCHAR(3)BEGINSELECT@Date=CONVERT(VARCHAR(18),GETDATE(), 112);    --业务规则处理ENDGO

如果你把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)ASBEGINDECLARE@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);--业务规则ENDGO
作者:潇湘隐者

出处:http://www.cnblogs.com/kerrycode/