SqlServer2008 - 我可以在许多地方引用标量函数时更改标量函数

Cas*_* C. 10 t-sql sql-server user-defined-functions

我们有一个返回DateTime的标量函数.它执行几个快速表选择以获得其返回值.这个函数已经在整个数据库中使用 - 在默认约束,存储过程等等.我想改变函数的实现(删除表命中并使其更有效)但显然我不能这样做它由数据库中的其他对象引用.我是否真的需要更新或删除数据库中引用它的每个对象,更新函数然后更新或重新创建所有这些对象以恢复对函数的引用?
该函数由少数视图,触发器,一些函数以及大量默认约束和存储过程引用.

感谢您提供的任何见解.

当我尝试改变或删除函数时我得到的错误是:

不能[ALTER | DROP FUNCTION]'dbo.GetClientCurrentTime',因为它被对象'DF_tbl_PatientOrder_Note_RecordCreated'引用.

Rem*_*anu 2

这取决于。如果引用该函数的对象具有该WITH SCHEMABINDING选项,那么您将被明确阻止干扰该函数。否则,唯一的限制是普通的 DDL 访问锁定限制,这意味着使用该函数的执行计划将在该函数上放置架构稳定性锁,这将阻止您的 ALTER FUNCTION 语句,因为它们需要架构修改锁。但当计划完成执行后,这个问题就会自行解决。

  • 一个稍微不那么痛苦的方法是重新定义列以返回正确数据类型的任意常量,修改您的函数,然后使用更改后的函数重新应用计算列公式,而不是完全删除计算列。我确实说过“稍微减轻”痛苦。 (2认同)