0
我在我的系统这个异常追查错误 - 至少它在我的15个目录类似,但不平等的模式系统异常。
是什么导致[INFORMATION_SCHEMA]。[VIEWS]中的[TABLE_NAME]与[VIEW_DEFINITION]中的值不同?
它让我觉得我不明白SQL Server中的视图或系统表... 。
我在我的系统这个异常追查错误 - 至少它在我的15个目录类似,但不平等的模式系统异常。
是什么导致[INFORMATION_SCHEMA]。[VIEWS]中的[TABLE_NAME]与[VIEW_DEFINITION]中的值不同?
它让我觉得我不明白SQL Server中的视图或系统表... 。
如果您已重命名视图,则名称会更改,但定义不会。
你应该这样做的DROP
/CREATE
或ALTER
脚本,而不是通过右键单击或使用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
我敢肯定你对它是如何进入这个状态是正确的。 'sp_refreshsqlmodule'得到一个错误,看起来像是试图解析'INFORMATION_SCHEMA'中的相同的陈旧视图定义。我尝试了你的另一种方法,但我不知道从哪里来定义。将sys.view中的object_id与获取http://msdn.microsoft.com/en-us/library/ms345522.aspx#_FAQ35上的两个获取视图定义的方法结合使用,也产生了陈旧的定义。最后,我在SMSS中编写了一个'ALTER VIEW',然后快速运行它,结果是我的修复程序! –
该定义可在['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)元数据功能。 –
感谢您的更新。就像一些背景一样,这个目录是在我的第二个月在工作中使用Sql Server创建的,我还没有注意到'SCRIPT AS'技术的用处,我现在正在学习SMSS调用sp_rename,而不是生成适当的'ALTER'语句。 –