0

红绿灯状态

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 并加入其中,还是因为这些功能是确定性的所以没关系?

4

1 回答 1

1

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

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

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

于 2013-06-21T14:53:15.680 回答