Sql 更改表和视图的数据类型

Sql 更改表和视图的数据类型,sql,sql-server,sql-server-2008,sql-server-2005,Sql,Sql Server,Sql Server 2008,Sql Server 2005,我有一个很大的数据库,有很多视图和表 现在在许多表和视图中,名为“Company”的列的数据类型是INT 随着时间的推移,数据发生了变化,现在我们希望'Company'列保存字符值 我是否可以编写一个游标来更改所有这些表和视图的数据类型,因为手动更改数据类型非常耗时 我尝试通过以下链接修改数据类型: 但这仅适用于表,我无法更改视图的数据类型 提前感谢您的帮助 如果在视图中看不到正确的数据类型,则需要重新编译它们。如果依赖对象发生更改,SQL Server在使视图无效方面不是很聪明。例如,如果您有

我有一个很大的数据库,有很多视图和表

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

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

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

我尝试通过以下链接修改数据类型:

但这仅适用于表,我无法更改视图的数据类型


提前感谢您的帮助

如果在视图中看不到正确的数据类型,则需要重新编译它们。如果依赖对象发生更改,SQL Server在使视图无效方面不是很聪明。例如,如果您有一个视图,该视图从表中选择了(您无论如何都不应该这样做),并且您添加了一列,则该视图将不会反映新列,直到您重新编译它。对从属对象的其他更改也是如此


要重新编译视图,请使用存储过程
sp\u refreshview
。这说明了过程,页面底部还有一个脚本,允许您批量刷新所有视图。

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

如果不是,可能是因为如果视图不是使用
schemabinding
创建的,则在对视图基础对象进行更改时,应运行
sp_refreshview
,从而影响视图的定义。否则,查询视图时可能会产生意外结果。因此,正如@Ralf,I+1所建议的那样,使用
sp\u refreshview
更新视图

对于您的注释,
ALTER TABLE ALTER COLUMN Company失败,因为一个或多个对象访问该列。
这是因为某些约束或索引正在使用该列,您必须先删除该列,然后只有您才能更改该列

您可以使用查询查找相关约束:

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()
删除列上的任何索引和/或约束,然后尝试alter,它必须工作

另请参阅此问题的答案


希望有帮助。

由于视图只是一个或多个表中数据的视图,您不需要更改视图的数据类型-应该自动完成。不,您不想这样做。谢谢,:)在更改表时,它会抛出一个错误“ALTER TABLE ALTER COLUMN Company失败,因为一个或多个对象访问此列。,我是否可以编写一些代码来禁用此依赖项一段时间,然后将其还原