我有一个包含大量视图和表格的大型数据库。
现在在许多表和视图中,列的数据类型名为'Company'
INT
随着时间的推移数据发生变化,现在我们希望'Company'
列保存字符值。
我是否可以编写游标来更改所有这些表和视图的数据类型,因为手动更改数据类型非常耗时。
我尝试在此链接的帮助下修改数据类型:How to Change All Sql Columns of One DataType into Another
但这只适用于表,我无法更改Views
的数据类型提前感谢您的帮助!
答案 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)
希望它有所帮助。