2014-06-11 65 views
0

我有一個很大的數據庫,有很多的視圖和表格。改變表格和視圖的數據類型

現在

在許多表和視圖列的數據類型,命名爲'Company'INT

隨時間變化的數據,現在我們要'Company'列,以保存字符值。

我可以編寫一個遊標來更改所有這些表和視圖的數據類型,因爲手動更改數據類型非常耗時。

我試圖修改數據類型與該鏈接的幫助:How to Change All Sql Columns of One DataType into Another

但這是工作只對表,我不能夠改變視圖的數據類型事先

感謝您的幫助!

+1

由於視圖只是一個或多個表中數據的視圖,因此不需要更改視圖的數據類型 - 它應該自動完成 – duDE

+0

不,您*不希望這樣做。 – podiluska

+0

謝謝,:)在修改表時,它拋出一個錯誤,「ALTER TABLE ALTER COLUMN公司失敗,因爲一個或多個對象訪問此列」,我可以編寫一些代碼來禁用此依賴關係一段時間,然後恢復它 – sumit

回答

1

如果在視圖中看不到正確的數據類型,則需要重新編譯它們。如果依賴對象發生變化,SQL Server對於使視圖失效並不是很聰明。例如。如果您認爲select *(您反正不應該這樣做)並且添加了一列,則該視圖在重新編譯之前不會反映新列。對依賴對象的其他更改也是如此。

重新編譯視圖使用存儲過程sp_refreshview。這MSDN page描述的過程,並在頁面的底部有一個腳本,允許您批量刷新所有視圖。

1

首先,你不需要修改任何視圖。相應表中的任何更改都會自動反映在您的視圖中。

如果不是,可能是因爲如果未使用schemabinding創建視圖,則應在對影響視圖底層的對象進行更改時運行sp_refreshview,以影響視圖的定義。否則,查詢時查看可能會產生意想不到的結果。正如@Ralf建議的那樣,我+1那個答案,用sp_refreshview來更新視圖。

For your comment ALTER TABLE ALTER COLUMN Company failed because one or more objects access this column.這是因爲某些約束或索引正在使用該列,必須首先刪除該列,然後只有您可能能夠更改該列。

您可以使用查詢查找相關約束:

select db_name() as CONSTRAINT_CATALOG 
,t_obj.name as TABLE_NAME 
,user_name(c_obj.uid) as CONSTRAINT_SCHEMA 
,c_obj.name as CONSTRAINT_NAME 
,col.name as COLUMN_NAME 
,col.colid as ORDINAL_POSITION 
,com.text as DEFAULT_CLAUSE 

from sysobjects c_obj 
join syscomments com on c_obj.id = com.id 
join sysobjects t_obj on c_obj.parent_obj = t_obj.id 
join sysconstraints con on c_obj.id = con.constid 
join syscolumns col on t_obj.id = col.id 
and con.colid = col.colid 
where 
c_obj.uid = user_id() 

砸&列任何索引和/或約束,則嘗試改變,就必須工作,然後。

也可參考這個問題的答案Drop a column from table problem (SQL Server 2008)

希望它能幫助。