none
函数确定性问题 RRS feed

  • 问题

  • create function dbo.fT1(@t1 int) returns int as
    begin
     return 1
    end
    go

    select dbo.fT1(1) from tUser

    dbo.fT1是不是确定性函数,点解调试时每一次都进入dbo.fT1内,还是调试时才每一次都调用呀?
    2009年12月3日 14:13

答案

  • 在WITH 中指定 SCHEMABINDING 就好了, 参考:
    use tempdb;
    go
    create function dbo.f1()
    returns int
    as
    begin;
    	return 1;
    end;
    go
    create function dbo.f2()
    returns int
    with schemabinding
    as
    begin;
    	return 1;
    end;
    go
    select 
    	f1 = OBJECTPROPERTY(OBJECT_ID('dbo.f1'), 'IsDeterministic'),
    	f2 = OBJECTPROPERTY(OBJECT_ID('dbo.f2'), 'IsDeterministic')
    ;
    go
    
    drop function dbo.f1, dbo.f2
    
    /* return
    f1          f2
    ----------- -----------
    0           1
    
    (1 row(s) affected)
    
    */
    • 已标记为答案 SQL STUDIO 2009年12月4日 6:20
    2009年12月4日 4:16

全部回复

  • 这个函数,给定了输入你就能确定其输出,所以是确定性的:http://msdn.microsoft.com/en-us/library/ms178091.aspx 
    不清楚你在问什么,但sql server不会cache函数的结果,所以每次调用都会进入fT1函数体(和调试没关系)
    你实际工作的fT1应该不仅是return 1,如果它的结果集可以放到一个table中,那么为了提高速度,可以JOIN这个table,将函数逻辑转化为表操作。
    Relate all.
    • 已建议为答案 孙同海 2009年12月11日 2:42
    2009年12月4日 1:48
  • sql server不会cache函数的结果,确定性是有何用?

    函数有确定性,且输入固定参数不是就会cache函数结果吗?

    --这里fT1是一个简单的例子,要是复杂的费时间的,那会很慢
    如果是这样的,那防止重复执行喜不是就要

    declare @i int
    set @i=dbo.fT1(1)

    select @i from tUser
    2009年12月4日 3:20
  • 在WITH 中指定 SCHEMABINDING 就好了, 参考:
    use tempdb;
    go
    create function dbo.f1()
    returns int
    as
    begin;
    	return 1;
    end;
    go
    create function dbo.f2()
    returns int
    with schemabinding
    as
    begin;
    	return 1;
    end;
    go
    select 
    	f1 = OBJECTPROPERTY(OBJECT_ID('dbo.f1'), 'IsDeterministic'),
    	f2 = OBJECTPROPERTY(OBJECT_ID('dbo.f2'), 'IsDeterministic')
    ;
    go
    
    drop function dbo.f1, dbo.f2
    
    /* return
    f1          f2
    ----------- -----------
    0           1
    
    (1 row(s) affected)
    
    */
    • 已标记为答案 SQL STUDIO 2009年12月4日 6:20
    2009年12月4日 4:16
  • 我错了,zjcxc是对的,WITH SCHEMABINDING 就能把fT1变成确定性的了。MSDN没有写清楚这一点。
    http://msdn.microsoft.com/en-us/library/ms186755.aspx 提到:Local data access is allowed in deterministic functions,这应该是你指的cache的意思。

    Relate all.
    2009年12月11日 1:40