use Tempdb go if object_id('UserMTR') is not null drop table [UserMTR] go create table UserMTR(UserNo varchar(12) primary key , UserName nvarchar(50)) go create function test_fun() returns char(12) as begin declare @Max char(12) select @Max=right('0000'+rtrim((isnull(max(right(UserNo,4)),0)+1)),4) from UserMTR where convert(varchar(8),getdate(),112)=left(UserNo,8) return convert(varchar(8),getdate(),112)+@Max end go alter table UserMTR add constraint U_UserMTR_UserNO default (dbo.test_fun()) for UserNo go insert userMTR (UserName) values(N'张三') go insert userMTR (UserName) values(N'李四') select * from userMTR UserNo UserName ------------ -------------------------------------------------- 200905150001 张三 200905150002 李四 (2 个资料列受到影响)
SQL 2000自定义函数调用GETDATE()报错
在SQL 2000数据库里的自定义函数中调用GETDATE()时,结果编译时报错,提示错误如下:Invalid use of 'getdate' within a function
我给个测试例子如下所示,
-- ================================================================================================
-- Author : Kerry
-- CreateDate : 2011-03-23
-- Description : 根据规则自动生成流水号
-- ------------------------------------------------------------------------------------------------
-- UpdateDate :
-- ------------------------------------------------------------------------------------------------
CREATE PROCEDURE USP_RiminSampleNoGenerate
@Type VARCHAR ( 10 )
AS
SET NOCOUNT ON ;
DECLARE @SampleNo AS VARCHAR ( 30 );
DECLARE @Date AS VARCHAR ( 8 );
DECLARE @SerialNumber AS VARCHAR ( 3 )
BEGIN
SELECT @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 :
------------------------------------------------------------------------------------------------
CREATE FUNCTION [dbo].[FUN_GenerateRaminiSampleNo](@Type VARCHAR(10), @DateTime DATETIME)
RETURNS VARCHAR(30)
AS
BEGIN
DECLARE @SampleNo VARCHAR(30);
DECLARE @Date VARCHAR(8);
DECLARE @SerialNumber VARCHAR(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