SQL Server 2008-sp_refreshview在某些视图上被炸掉

|| 我继承了一个相当大的项目,该项目大量使用了SQL Server(2005和2008)视图。 生成过程的第一步是调用ѭ0系统存储过程,以确保没有对任何表的更改破坏我们的视图。除了大约三到四个(200个以上的视图)之外,这个效果还不错。 有了这些,它就炸了-发出奇怪的错误消息,例如   讯息15165,第16级,状态1,   程序   sp_refreshsqlmodule_internal,第55行   找不到对象   \'vYourViewNameHere \',或者您没有   得到许可。 这是完全错误的-该视图确实存在,我绝对可以从中选择。 我似乎找不到任何很好的简明信息,以了解发生这种情况的原因,触发原因的原因……任何想法?我有什么办法可以发现这种有问题的观点?我可以更改其definitino,以便再次刷新它们吗? 更新:为此,我在Microsoft Connect上记录了一个错误报告-如果您同意这似乎很奇怪并且需要解决,请对其投票! https://connect.microsoft.com/SQLServer/feedback/details/676728/sp-refreshview-crashes-with-misleading-error-on-views-with-schemabinding     
已邀请:
        我在您提及的评论中注意到它具有SCHEMABINDING。我几乎可以保证这就是问题所在。在线书籍特别指出,这是用于非架构绑定的视图。 受限于方案的视图将不允许进行重大更改,因此不需要更新元数据。您可以安全地跳过它。 您可以像这样标识所有已绑定架构的视图:
SELECT * FROM sys.views WHERE OBJECTPROPERTY(object_id, \'IsSchemaBound\')=1
    
        使用sp_helptext时遇到了相同的错误。在我的情况下,原因是使用sp_rename重命名视图。下面的代码重现此错误。
create view demo as select dummy = 1
go

exec sp_rename \'demo\', \'new_demo\'
go

exec sp_refreshview \'new_demo\'
go
唯一的解决方案是手动更改视图。将此修复程序应用于上述解决方案,您将获得:
create view demo as select dummy = 1
go

exec sp_rename \'demo\', \'new_demo\'
go

-- This statement fixes the problem
alter view new_demo as select dummy = 1
go

exec sp_refreshview \'new_demo\'
go
    
        这个错误的体现是:   消息8116,级别16,状态1,过程sp_refreshsqlmodule_internal,   第75行的参数数据类型int对于子字符串的参数1无效   功能。 db脚本中的各个位置都报告了此错误消息。我会说错地方。如果我注释掉该SQL,则会报告此错误,其他地方也会报告该错误。 我将脚本中的以下调用注释为一种解决方法,该脚本将成功完成。
-- EXECUTE sp_refreshview @viewName;
注意:运行RThomas的相邻答案https://stackoverflow.com/a/6460532/179972中建议的查询时,我的数据库未报告具有架构绑定视图 更新-解决方案: 成功注释掉
sp_refreshview
命令后,数据库脚本成功运行(如上所示),然后我们自己运行视图刷新代码,它也成功。 - 对于它如何成功工作,这个答案对我而言没有任何意义,但是,如果对其他人有帮助,我会在此处进行记录。     
        要查找哪个视图是您的问题,请在普通的sppRefreshViews中添加打印件。这里没有什么土崩瓦解,但我想我会分享。
CREATE procedure sppRefreshViews2

    as
    declare @t varchar (1024)

    declare tbl_cur cursor for
    select TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = \'VIEW\' and table_name like \'sp%\'
    OPEN tbl_cur

    FETCH NEXT from tbl_cur INTO @t
    WHILE @@FETCH_STATUS = 0
    BEGIN
    print      @t 
    exec (\'sp_refreshview \'\'\' + @t + \'\'\'\')
    FETCH NEXT from tbl_cur INTO @t
    END

    CLOSE tbl_cur
    DEALLOCATE tbl_Cur
    

要回复问题请先登录注册