2012-05-22 32 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'語句。 –