我一直以为更新存储过程是我在用户积极使用系统时可以做的事情。
但是我目前正在测试存储过程的更新,并且正在执行对sproc的长时间运行的调用(调用时已超过4分钟),因此我更新了sproc。(我打算在单独的窗口中尝试其他查询计划。)
当我回到长期运行的机器时,出现了以下错误:
The definition of object 'MySprocName' has changed since it was compiled.
该错误似乎表明,如果更新了该存储过程的定义,则任何正在执行的存储过程都会失败。(我认为,一旦存储程序开始运行,尽管定义有所更改,它将在其余的运行中使用该计划。)
这是真的?我是否需要停机才能更新存储过程的定义?
3
存储过程调用是更大事务的一部分吗?是否有任何代码可以删除任何模式锁?从理论上讲,变更应该被阻止。您能否详细介绍该程序的功能以及它的组成部分?
—
亚伦·伯特兰
@aaron Bertrand-这是一个相当不错的程序。它有一些精选的热门来电。没有锁或其他类似的东西。唯一有意义的是它具有一些基于参数的“ if”语句。实际查询运行会根据参数有所不同。它是从.net服务调用的。
—
瓦卡诺
“相当良性”的过程应该不需要四分钟的时间。那段时间一直在做什么?
—
亚伦·伯特兰
您是否尝试过alter proc <proc Name>
—
MarmiK
WITH RECOMPILE
?这是一个过程级别的选项,用于将过程设置为在每次运行后重新编译。这意味着该计划将始终重新编译,因此避免了重用缓存的计划。
dba.stackexchange.com/questions/154939/…您是否看过这个问题?
—
k010mb0