2000下自定义函数和不确定性内置系统函数
作者:hapyflystone blog:http://blog.csdn.net/happyflytone
转载请注明出处
我们经常在想自定义函数内调用一些不确定性的系统函数,可是天不作美系统会报错,下面演示一下系统函数getdate().
--创建函数
create function f_getsystemdate()
returns datetime
as
begin
return getdate()
end
go
--调用
select dbo.f_getsystemdate()
--删除
drop function f_getsystemdate
/*
消息443,级别16,状态1,过程f_getsystemdate,第5 行
在函数内不正确地使用了'getdate'。
*/
那么我们如何来解决这个问题呢,参照http://sqlserver2000.databases.aspfaq.com/how-do-i-use-getdate-within-a-user-defined-function-udf.html 作如下整理:
(注:以下以getdate()为例说明解决方法)
--1、把不确定性的系统函数值作为参数传入
--创建函数
create function f_getsystemdate(@dt datetime)
returns datetime
as
begin
return @dt
end
go
--调用
select dbo.f_getsystemdate( getdate())
/*
-----------------------
2008-12-24 12:46:25.850
(1 行受影响)
*/
--调用
declare @dt datetime
set @dt = getdate() --或:set @dt = CURRENT_TIMESTAMP
select dbo.f_getsystemdate( @dt)
/*
-----------------------
2008-12-24 12:46:25.850
(1 行受影响)
*/
--删除
drop function f_getsystemdate
--2、视图
create view v_currentsystemtime
as
select getdate() as dt
go
create function f_getsystemdate( )
returns datetime
as
begin
declare @dt datetime
select @dt = dt from v_currentsystemtime
return @dt
end
go
--调用
select dbo.f_getsystemdate( )
/*
-----------------------
2008-12-24 12:49:08.883
(1 行受影响)
*/
--删除
drop function f_getsystemdate
drop view v_currentsystemtime
--3、扩展过程
--借助第三方工具做一个DLL然后在SQL SERVER中注册成扩展过程,然后在函数里直接调用。
--4、openquery,openrowset
create function f_getsystemdate( )
returns datetime
as
begin
declare @dt datetime
select @dt= dt
from openrowset
( 'SQLOLEDB', '.'; 'sa '; '',
'select CURRENT_TIMESTAMP as dt')
--from OPENROWSET
--( 'SQLOLEDB', '.'; 'sa '; '', 'select getdate() as dt')
--from OPENROWSET
--('SQLOLEDB','SERVER=.;UID=sa;PWD=','select getdate() as dt')
--from OPENROWSET
--('SQLOLEDB','SERVER=.;
--UID=sa;PWD=','select CURRENT_TIMESTAMP as dt')
return @dt
end
go
--调用
select dbo.f_getsystemdate( )
/*
-----------------------
2008-12-24 12:55:11.583
(1 行受影响)
*/
--删除
drop function f_getsystemdate
--如果有linkserver还可以这样:
FROM OPENQUERY ( 'flystone','SELECT dt = GETDATE()')
--5、openrowset+proc
use jhhis
go
create proc pr_getsystemdate
as
begin
select getdate() as dt
end
go
create function f_getsystemdate( )
returns datetime
as
begin
declare @dt datetime
select @dt= dt
from openrowset
( 'SQLOLEDB', '.'; 'sa '; '',
' exec jhhis.dbo.pr_getsystemdate ')
--from OPENROWSET
--('SQLOLEDB','SERVER=.;UID=sa;PWD=','select getdate() as dt')
return @dt
end
go
--调用
select dbo.f_getsystemdate( )
/*
-----------------------
2008-12-24 13:05:06.250
(1 行受影响)
*/
--删除
drop function f_getsystemdate
drop proc pr_getsystemdate
--说明:本blog参照了
http://sqlserver2000.databases.aspfaq.com/how-do-i-use-getdate-within-a-user-defined-function-udf.html
--大家可以去看看