改变表和视图的数据类型

时间:2014-06-11 09:29:01

标签: sql sql-server sql-server-2008 sql-server-2005

我有一个包含大量视图和表格的大型数据库。

现在在许多表和视图中,列的数据类型名为'Company' INT

随着时间的推移数据发生变化,现在我们希望'Company'列保存字符值。

我是否可以编写游标来更改所有这些表和视图的数据类型,因为手动更改数据类型非常耗时。

我尝试在此链接的帮助下修改数据类型:How to Change All Sql Columns of One DataType into Another

但这只适用于表,我无法更改Views

的数据类型

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如果在视图中没有看到正确的数据类型,则需要重新编译它们。如果依赖对象发生更改,SQL Server对于使视图无效非常聪明。例如。如果您从表中看到select *(您不应该这样做)并且添加了一列,则在重新编译之前,该视图将不会反映新列。对于依赖对象的其他更改也是如此。

要重新编译视图,请使用存储过程sp_refreshview。此MSDN page描述了该过程,并在页面底部还有一个脚本,允许您批量刷新所有视图。

答案 1 :(得分:1)

首先,您无需修改​​视图中的任何内容。相应表格中的任何更改都将自动反映在您的视图中。

如果不是,则可能是因为如果未使用schemabinding创建视图,则应在对视图下方影响视图定义的对象进行更改时运行sp_refreshview。否则,查询时视图可能会产生意外结果。正如@Ralf所建议的那样,我为答案+1,使用sp_refreshview来更新视图。

对于您的评论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)

希望它有所帮助。