SQL 2000自定义函数调用GETDATE()报错

本文探讨了在SQL Server环境中如何使用自定义函数生成带有日期前缀的自动递增编号,并解决了在SQL Server 2000中使用GETDATE()函数产生的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sql server 中自动编号的问题

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()报错

作者: 潇湘隐者  来源: 博客园  发布时间:2011-03-23 22:38  阅读:140 次   原文链接    [收藏] 

在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 );
    --业务规则处理
END
GO

如果你把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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值