2012-05-22 31 views
0

enter image description here视图名称如何与视图定义不同步?

我在我的系统这个异常追查错误 - 至少它在我的15个目录类似,但不平等的模式系统异常。

是什么导致[INFORMATION_SCHEMA]。[VIEWS]中的[TABLE_NAME]与[VIEW_DEFINITION]中的值不同?

它让我觉得我不明白SQL Server中的视图或系统表... 。

回答

3

如果您已重命名视图,则名称会更改,但定义不会。

你应该这样做的DROP/CREATEALTER脚本,而不是通过右键单击或使用sp_rename

这实际上是所有模块的预期行为。这里是一个快速测试使用一个简单的存储过程:

CREATE PROCEDURE dbo.proc_foo 
AS 
    SELECT 1; 
GO 

-- rename it to proc_bar 

EXEC sp_rename N'dbo.proc_foo', N'proc_bar', N'OBJECT'; 
GO 

-- check the definition from various sources 

SELECT od = OBJECT_DEFINITION(OBJECT_ID('dbo.proc_bar')), 
    info_s = (SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES 
       WHERE ROUTINE_NAME = 'proc_bar'), 
    sql_m = (SELECT definition FROM sys.sql_modules 
      WHERE [object_id] = OBJECT_ID('proc_bar')); 

结果:

od        info_s       sql_m 
----------------------------- ----------------------------- ----------------------------- 
CREATE PROCEDURE dbo.proc_foo CREATE PROCEDURE dbo.proc_foo CREATE PROCEDURE dbo.proc_foo 
AS        AS        AS 
    SELECT 1;      SELECT 1;      SELECT 1; 

在任何情况下,你不应该使用INFORMATION_SCHEMA反正... http://sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/the-case-against-information-schema-views.aspx

+0

我敢肯定你对它是如何进入这个状态是正确的。 'sp_refreshsqlmodule'得到一个错误,看起来像是试图解析'INFORMATION_SCHEMA'中的相同的陈旧视图定义。我尝试了你的另一种方法,但我不知道从哪里来定义。将sys.view中的object_id与获取http://msdn.microsoft.com/en-us/library/ms345522.aspx#_FAQ35上的两个获取视图定义的方法结合使用,也产生了陈旧的定义。最后,我在SMSS中编写了一个'ALTER VIEW',然后快速运行它,结果是我的修复程序! –

+0

该定义可在['sys.sql_modules'](http://msdn.microsoft.com/en-us/library/ms175081(SQL.105).aspx)中找到,您可以将它加入['sys.objects' ](http://msdn.microsoft.com/en-us/library/ms190324%28SQL.105%29.aspx)或['sys.views'](http://msdn.microsoft.com/en-us /library/ms190334%28SQL.105%29.aspx)放在'[object_id]'上。您还可以使用['OBJECT_DEFINITION()'](http://msdn.microsoft.com/zh-cn/library/ms176090(SQL.105).aspx)元数据功能。 –

+0

感谢您的更新。就像一些背景一样,这个目录是在我的第二个月在工作中使用Sql Server创建的,我还没有注意到'SCRIPT AS'技术的用处,我现在正在学习SMSS调用sp_rename,而不是生成适当的'ALTER'语句。 –