更改表和视图的数据类型
Posted
技术标签:
【中文标题】更改表和视图的数据类型【英文标题】:Altering the Data Type of Table and View 【发布时间】:2014-06-11 09:29:01 【问题描述】:我有一个包含大量视图和表格的大型数据库。
现在在很多表和视图中列的数据类型,命名为'Company'
是INT
随着时间的推移数据发生变化,现在我们希望'Company'
列保存字符值。
我可以写一个游标来更改所有这些表和视图的数据类型,因为手动更改数据类型很耗时。
我尝试在此链接的帮助下修改数据类型:How to Change All Sql Columns of One DataType into Another
但这仅适用于 table ,我无法更改 Views 的数据类型
提前感谢您的帮助!
【问题讨论】:
由于视图只是一个或多个表中数据的视图,您不需要更改视图的数据类型 - 它应该自动完成 不,你不想这样做。 谢谢,:) 在更改表时抛出错误“ALTER TABLE ALTER COLUMN Company failed 因为一个或多个对象访问此列。”,我可以编写一些代码来禁用此依赖项一段时间,然后将其还原 【参考方案1】:如果您在视图中没有看到正确的数据类型,那么您需要重新编译它们。如果依赖对象发生更改,SQL Server 对于使视图无效的做法不是很聪明。例如。如果您从表中获得select *
的视图(无论如何您都不应该这样做)并且您添加了一个列,则该视图将不会反映新列,直到您重新编译它。对依赖对象的其他更改也是如此。
要重新编译视图,请使用存储过程sp_refreshview
。这个MSDN page 描述了该过程,并且在页面底部还有一个脚本,允许您批量刷新所有视图。
【讨论】:
【参考方案2】:首先,您不需要修改视图中的任何内容。相应表格中的任何更改都会自动反映在您的视图中。
如果不是,可能是因为如果视图不是使用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)
希望对你有帮助。
【讨论】:
以上是关于更改表和视图的数据类型的主要内容,如果未能解决你的问题,请参考以下文章