首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

[讨论]何时使用NOT DETERMINISTIC解决思路

2012-03-18 
[讨论]何时使用NOT DETERMINISTICIFEXISTS(SELECT*FROMsysobjectsWHEREtypePANDnamefn_getStoreStatus )

[讨论]何时使用NOT DETERMINISTIC
IF   EXISTS  
        (SELECT   *   FROM   sysobjects  
        WHERE   type   =   'P '  
        AND   name   =   'fn_getStoreStatus ')
        DROP   PROCEDURE     fn_getStoreStatus
go
CREATE   FUNCTION   "DBA ". "fn_getStoreStatus "(IN   @StoreID   varchar(72)   )
RETURNS   varchar(40)
NOT   DETERMINISTIC   <================+++++++++++++
/*
FUNCTION:               fn_getStoreStatus
AUTHOR:                   @@@@
DATE:                       05/19/2006
DESCRIPTION:         Get   the   store   status            
INPUTS:                   StoreId
OUTPUTS:                 Status
MODIFIED:               n/a
*/
BEGIN
        DECLARE   @StoreStatus   varchar(40);
        declare   @StoreAK   varchar(64);
declare   @ApprovalStatusCd   varchar(40);
    select   @StoreAK   =   StoreAK   from   tblStore   where   StoreID   =   @StoreID;
    select   @ApprovalStatusCd   =   ApprovalStatusCd   from   tblStoreApproval   where   StoreID   =   @StoreID   and   activeflg   =   '1 ';
if   (@ApprovalStatusCd   =   fn_getInternalCode( 'StoreApprovalStatusCd ', 'Rejected '))   then
    set   @StoreStatus= 'rejected ';
else
    if(@ApprovalStatusCd   =   fn_getInternalCode( 'StoreApprovalStatusCd ', 'NewStore '))   or   (@ApprovalStatusCd   =   fn_getInternalCode( 'StoreApprovalStatusCd ', 'Submitted ')   and   @StoreAK   is   null)   then
            /*new   store*/
              set   @StoreStatus= 'new ';
    else
            if(@ApprovalStatusCd   =   fn_getInternalCode( 'StoreApprovalStatusCd ', 'Submitted ')   or   @ApprovalStatusCd   =   fn_getInternalCode( 'StoreApprovalStatusCd ', 'Pending '))   and   @StoreAK   is   not   null   then
                    /*modify   store*/
                      set   @StoreStatus= 'modified ';
            else
                    set   @StoreStatus= '   ';
            end   if;
    end   if;
end   if;
        RETURN   @StoreStatus
END;

上面的函数用到了NOT   DETERMINISTIC,不过我个人认为不妥,认为没有必要使用。我参考了SABase   9的帮助文件
===========================================================
NOT   DETERMINISTIC   子句         指定为   NOT   DETERMINISTIC   的函数每次在查询中调用时都将重新求值。不是以这种方式指定的函数的结果可以高速缓存起来以便提高性能,并且每次在查询求值过程中使用相同的参数调用函数时,都会重用高速缓存的结果。



如果函数有副作用(比如修改基础数据),应将其声明为   NOT   DETERMINISTIC。例如,一个生成主键值并用在   INSERT   ...   SELECT   语句中的函数应声明为   NOT   DETERMINISTIC:

===========================================================

***********************************************************
另外,如果函数对给定的输入参数总是返回相同的值,则可以将其声明为   DETERMINISTIC。在本软件的将来版本中,可能使用此声明来实现对同一输入可能返回不同值的函数的优化,而这些优化在目前可能是不安全的。
其中的 "如果函数对给定的输入参数总是返回相同的值 "我应该如何理解?是说输入与输出参数关系一对一的么??还是。。

***********************************************************


所以我认为是多余的,望朋友指点一二  



[解决办法]
NOT DETERMINISTIC
从来没见过这个函数

热点排行
Bad Request.