更改表和视图的数据类型

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)

希望对你有帮助。

【讨论】:

以上是关于更改表和视图的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

如何更改视图的数据类型

是否可以更改视图中列的数据类型?

如何查询oracle中的所有表和视图

SQL Server 2012 将数据类型 varchar 转换为数字时出错

如何更改 MySQL 上的存储引擎类型?

大数据BI工具tableau学习第三期:数据类型,功能区和卡参考,文件类型(连接方式)