2000下自定义函数调用不确定性内置系统函数

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中注册成扩展过程,然后在函数里直接调用。

--4openquery,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()')

--5openrowsetproc

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

--大家可以去看看

你可能感兴趣的:(sql,SQL Server,F#,Blog,Go)