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'語句。 –