Sql server SqlServer2008-当标量函数在许多地方被引用时,我可以修改它吗

Sql server SqlServer2008-当标量函数在许多地方被引用时,我可以修改它吗,sql-server,tsql,user-defined-functions,Sql Server,Tsql,User Defined Functions,我们有一个返回日期时间的标量函数。它执行两次快速表格选择以获取其返回值。这个函数已经在整个数据库中使用——在默认约束、存储过程中,等等。我想更改该函数的实现(以删除表命中并使其更高效),但显然,当它被数据库中的其他对象引用时,我不能这样做。 我是否真的需要更新或删除数据库中引用它的每个对象,更新函数,然后更新或重新创建所有这些对象以恢复对函数的引用? 该函数被少数视图、触发器、两个函数以及大量默认约束和存储过程引用 感谢您提供的任何见解 尝试更改或删除函数时出现的错误是: 无法[ALTER |

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

感谢您提供的任何见解

尝试更改或删除函数时出现的错误是:


无法[ALTER | DROP FUNCTION]“dbo.GetClientCurrentTime”,因为对象“DF_tbl_PatientOrder_Note_RecordCreated”正在引用它


如果输入参数和输出类型不变,您应该能够进行任何需要进行的内部修改,而不会造成任何问题。

这取决于具体情况。如果引用该函数的对象具有
WITH SCHEMABINDING
选项,那么将明确禁止您使用该函数。否则,唯一的限制是普通DDL访问锁定限制,这意味着执行中使用函数的计划将在函数上放置模式稳定性锁,这将阻止ALTER function语句,因为它们需要模式修改锁。但当计划完成执行时,这将自行解决。

如果在派生列中使用它,则需要临时删除列。存储过程中的用法不需要修改。不确定默认约束的用法。显然,当它被数据库中的其他对象引用时,我不能这样做-你得到了什么错误,什么时候?我已经将我得到的错误添加到问题的主体中。我在文档中查找了SCHEMABINDING,找不到一种方法来确定对象的SCHEMABINDING是打开的还是关闭的。您是否希望错误消息表明问题与SCHEMABINDING有关?你知道有什么办法把它关掉吗?谢谢你的帮助。什么是创建的记录?另一个函数,一个派生列,一个检查约束?DF_tbl_PatientOrder_Note_RecordCreated是默认约束。该函数只被少数视图、触发器、几个函数和大量默认约束和存储的进程引用,这是一个糟糕的结果。好吧,你必须删除约束,修改函数,然后再添加约束。与检查约束不同,无法禁用默认约束。也许其他人有一个聪明的方法来避免这种情况,但我不知道。一个稍微不那么痛苦的方法,而不是完全删除计算列,是重新定义列以返回正确数据类型的任意常量,修改函数,然后用修改后的函数重新应用计算列公式。我确实说过“稍微少一点”痛苦。我当然是这么想的。事实上,我也应该能够做出突破性的改变——结果就是我打破了它。但就是不能改变一个函数,周期?这似乎是一个相当荒谬的限制。所以我想我一定是错过了一些能让我改变或放弃函数的环,事实上,错了。如果函数带有SCHEMABINDING的
,并且某些对象引用了它,那么您将无法对其运行任何alter。。。