Is there any way to make this UDF deterministic?

Cad*_*oux 4 sql-server deterministic user-defined-functions

我认为这不是确定性的,因为DB_NAME()它不是确定性的?如果DB_NAME()不是确定性的,为什么它不是确定性的?

ALTER FUNCTION [TheSchema].[udf_IS_PRODUCTION] ()
RETURNS bit
    WITH SCHEMABINDING
AS 
    BEGIN
        RETURN CASE WHEN DB_NAME() = 'PRODUCTION' THEN CONVERT(bit, 1) ELSE CONVERT(bit, 0) END
    END
Run Code Online (Sandbox Code Playgroud)

更新:此版本工作,是确定性的,允许在任何数据库中使用相同的代码并删除数据库名称的硬编码(这也允许我删除有关数据库名称编码的另一个自动系统运行状况异常)

ALTER FUNCTION [TheSchema].[udf_IS_PRODUCTION] ()
RETURNS bit
    WITH SCHEMABINDING
AS 
    BEGIN
        RETURN (SELECT IS_PRODUCTION FROM TheSchema.IS_PRODUCTION)
    END
Run Code Online (Sandbox Code Playgroud)

仅供参考这是我的系统健康自我报告系统中的代码片段,用于监控潜在问题.

    SELECT  'Non-deterministic Scalar UDF' AS Problem
           ,QUOTENAME(ROUTINE_SCHEMA) + '.' + QUOTENAME(ROUTINE_NAME) AS ROUTINE_NAME
    FROM    INFORMATION_SCHEMA.ROUTINES WITH (NOLOCK)
    WHERE   IS_DETERMINISTIC = 'NO'
            AND ROUTINE_TYPE = 'FUNCTION'
            AND DATA_TYPE <> 'TABLE'
    ORDER BY ROUTINE_SCHEMA
           ,ROUTINE_NAME
Run Code Online (Sandbox Code Playgroud)

Aar*_*ght 5

当然,我可以想出一种方法来确定它.在生产数据库上部署此功能:

ALTER FUNCTION [TheSchema].[udf_IS_PRODUCTION] ()
RETURNS bit
    WITH SCHEMABINDING
AS 
BEGIN
    RETURN CONVERT(bit, 1)
END
Run Code Online (Sandbox Code Playgroud)

并将此部署到您的测试数据库:

ALTER FUNCTION [TheSchema].[udf_IS_PRODUCTION] ()
RETURNS bit
    WITH SCHEMABINDING
AS 
BEGIN
    RETURN CONVERT(bit, 0)
END
Run Code Online (Sandbox Code Playgroud)

这可能看起来很愚蠢,但IMO数据库名称不应该比某些UDF的返回值更"硬编码".

更好的是,只需将此信息放在某个配置表中.