评估确定性函数

时间:2013-06-20 21:41:24

标签: sql-server-2008 tsql

StoplightStatus

1  - Red
2  - Yellow
3  - Green

因为这是一个确定性函数......

CREATE FUNCTION dbo.udf_StoplightStatusRed()
RETURNS TINYINT
WITH SCHEMABINDING
AS
    RETURN CAST(1 as TINYINT)
END

安全吗......

SELECT
    [Status] = CASE StoplightStatusID WHEN dbo.udf_StoplightStatusRed() THEN 1 ELSE 0 END
FROM dbo.StoplightAudit
WHERE StopLightStatusID = dbo.udf_StoplightStatusRed()

我知道,查询本身没有多大意义。我只想确保如果我这样做,我的函数不会被评估每一行。

我需要加入很多其他表来获取更多信息。最好先在CTE中获取所有审计ID并加入,或者无关紧要,因为这些功能是确定性的吗?

1 个答案:

答案 0 :(得分:0)

你的功能应该是确定性的:

  

确定性函数在使用一组特定的输入值调用并给定相同的数据库状态时,始终返回相同的结果。每次使用一组特定的输入值调用非确定性函数时,即使它们访问的数据库状态保持不变,它们也可能返回不同的结果。

     

数据库引擎自动分析Transact-SQL函数的主体并评估函数是否是确定性的。例如,如果函数调用其他非确定性函数,或者函数调用扩展存储过程,则数据库引擎会将函数标记为非确定性函数。对于公共语言运行时(CLR)函数,数据库引擎依赖函数的作者将函数标记为确定性或不使用SqlFunction自定义属性。