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

2024-05-27

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

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

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

FYI这是我的系统健康自我报告系统中的代码片段,我用它来监控潜在问题。

    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 的返回值更“硬编码”。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法让这个UDF具有确定性? 的相关文章

随机推荐

  • JavaScript 符号并不能阻止对象中的名称冲突

    我已经开始研究 JavaScript 中的符号 并开始在我的对象中使用它们来帮助解决名称冲突 但是在使用它们时我仍然可以覆盖属性吗 我很难理解 JavaScript 中符号的意义 它们被谈论了很多 人们说它们很聪明 因为它们不会导致对象中的
  • 赋值运算符左/右侧的不同切片行为

    作为一个来自 C 背景的 Python 新手 Python 3 4 x 中的切片运算符对我来说看起来很荒谬 我只是不明白 特殊规则 背后的设计理念 让我解释一下为什么我说它 特别 一方面 根据 Stack Overflow 的回答here
  • stripe.redirectToCheckout 参数:价格不是可接受的参数反应

    我在反应中的条纹结帐上遇到错误 我有一个按钮 单击它时 它应该重定向到条纹结帐页面 但是 我收到错误 Uncaught in promise IntegrationError Invalid stripe redirectToCheckou
  • 同时节点以状态 1 退出。这会停止 Teamcity,导致其认为测试失败

    我正在尝试同时运行两个脚本concurrently 基本命令如下所示 concurrently k success first node tools mock webapi mock webapi js npm run test singl
  • Svelte 路线给我 404

    我在 Svelte 中为我的应用程序创建了一个简单的路由器 如果我从导航栏访问链接 它就可以工作 如果我重新加载页面 它会给我 404 为什么
  • ASP.NET DropDownList OnSelectedIndexChanged 事件未触发

    我试图同时使用一些 AJAX 和 ASP Net 来运行函数而无需刷新整个页面 但我在执行此操作时偶然发现了一个问题 这是我的代码
  • C/C++:指针算术

    我在读一点 指针算术 发现有两件事我无法理解 也不知道它的用途 address expression address expression and also address expression gt address expression
  • 如何在 GLSL 1.3 和 OpenGL 2.1 中使用位运算

    我正在尝试编写一个使用许多位操作的着色器 事实上 从 glsl 1 30 开始就支持它们 但我只使用 OpenGL 2 1 有没有办法在我的 OpenGL 版本中使用位运算 所有 SM3 兼容 OpenGL 2 1 硬件支持limited整
  • Linq-to-Entity Join 与 GroupJoin

    有人可以解释一下什么是GroupJoin is 和普通的有什么不同Join 常用吗 它仅适用于方法语法吗 查询语法怎么样 如果有 C 代码示例就更好了 行为 假设您有两个列表 Id Value 1 A 2 B 3 C Id ChildVal
  • Android 相机 - 将图像保存到 SD 卡中的新文件夹中

    我有一个非常简单的应用程序 目前可以拍照然后保存图像 目前的问题是 由于某种原因 我无法找到图像在手机上的保存位置 我想要做的最终结果是 当拍摄照片时 图像会保存到 SD 卡上创建的新文件夹中 但如果该文件夹尚不存在 则必须创建该文件夹 自
  • Eclipse:C/C++ 插件下载链接?

    我下载了 Eclipse 3 5 1 的 Java EE 版本 我现在可以使用它通过适当的插件来编辑 C C 吗 我去了Help gt gt 安装新软件但我不知道使用哪个 URL 来获取 C C 插件 我在 Eclipse 网站上也找不到它
  • 在ggplot2中添加边框或背景以缩放图例guide_colorbar

    我在 ggplot 图中有一个从白色到红色的颜色条 并且白色边框在白色背景上不太明显 有没有办法对图例中的刻度线进行不同的着色或在渐变比例周围添加边框 这是一个最小的例子 df lt data frame x lt rnorm 10 y l
  • Android Studio 2.2 更新:未使用新的 Gradle 插件 2.2.0 生成对齐的 APK (zipAlign)

    将 Android Studio 更新到版本 2 2 后 我还获得了 Gradle 插件的更新 它是 2 1 3 classpath com android tools build gradle 2 2 0 我看到未对齐的变体 APK 文件
  • 在 Eclipse 中生成 POJO 的所有 setXXX 调用?

    我目前正在对 JPA 实体进行大量测试 其中我必须不断调用实体上的 setter 方法 如下所示 myEntity setXXX value myEntity setYYY value myEntity setZZZ value Eclip
  • 在游戏框架中编写功能测试的正确方法

    在为基于 play1 2 4 的 web 应用程序编写功能测试时 我对如何正确编码感到有点困惑 困惑在于所涉及的事务边界 我在某处读到每个测试都有自己的事务 在我的应用程序中 用户可以登录并向购物车添加一些商品 然后他可以提供一个地址 以便
  • Python argparse:需要两个并存的位置参数

    使用 argparse 如何指定我希望两个位置参数一起出现或根本不出现 IE 我希望我的使用字符串看起来像 Usage FooBar py h FOO BAR 正如 hpaulj 所建议的 这是您可以使用的解决方案 In 1 import
  • 使用 RSQLite 在 R 中加载 SQLite 表

    我有这个函数用来加载 SQLite 表 sqLiteConnect lt function database table library DBI library RSQLite con lt dbConnect SQLite dbname
  • 可用的最简单的操作系统是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有哪些小型开源操作系统 我正在寻找比 Puppy Linux Feather Linux DSL 等小
  • 如何在 vim 中覆盖 ~/.vim 和 ~/.vimrc 路径(但不能覆盖其他路径)?

    假设我有一个所有 vim 配置的 tarball 通常在 vim 中的所有内容 插件 自动加载 颜色 所有这些东西 和一个 vimrc 文件 我将其提取到某个目录中 所以在我所在的目录 PWD 中 有一个 vim 文件夹和一个 vimrc
  • 有没有办法让这个UDF具有确定性?

    我认为这不是确定性的 因为DB NAME 是不是确定性的 如果DB NAME 不是确定性的 为什么不是确定性的 ALTER FUNCTION TheSchema udf IS PRODUCTION RETURNS bit WITH SCHE