sql-server - 有没有办法让这个UDF具有确定性?

标签 sql-server user-defined-functions deterministic

我认为这不是确定性的,只是因为 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

更新:这个版本有效,是确定性的,允许在任何数据库中使用相同的代码,并删除数据库名称的硬编码(这也允许我删除另一个关于数据库名称编码)

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

仅供引用这是我的系统运行状况 self 报告系统中的代码片段,我用它来监控潜在问题。

    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

最佳答案

当然,我可以想出一种方法来使其具有确定性。在您的生产数据库上部署此函数:

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

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

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

这可能看起来很愚蠢,但在我看来,数据库名称不应该比某些 UDF 的返回值更“硬编码”。

更好的是,只需将此信息放入配置表中的某个位置即可。

关于sql-server - 有没有办法让这个UDF具有确定性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2118705/

相关文章:

java,如何在spark 1.4.1中调用UDF

c++ - 涉及函数的C++程序...请帮助我

python - 如何使用自定义 udf 实现对列进行舍入

algorithm - 有哪些确定性垃圾收集算法?

java - 查找没有哈希码的对象

mysql - 如果数据库中的数据发生更改怎么办,确定性关键字有什么作用?

sql - 在存储过程中将列转换为小数

sql-server - View的SQL查询耗时较长

c# - 连接到数据库

sql-server - SQL 查询迭代计划作业并将其删除。存储过程将 Job_Name 作为输入参数