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

--大家可以去看看

 

 

 

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值