sql-server - 如何在不删除依赖项的情况下更改数据类型

标签 sql-server sql-server-2008 t-sql

是否可以更改decimal列的精度而不删除并重新创建它的依赖项?

我尝试了以下方法:

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

ALTER TABLE dbo.MyTable
    ALTER COLUMN MyColumn DECIMAL(10, 3) NULL

EXEC sp_MSforeachtable @command1="ALTER TABLE ? CHECK CONSTRAINT ALL"

当我执行此查询时,我收到错误消息:

Msg 5074, Level 16, State 1, Line 8
The object 'MyView' is dependent on column 'MyColumn'.

Msg 5074, Level 16, State 1, Line 8
The index 'MyIndex' is dependent on column 'MyColumn'.

Msg 4922, Level 16, State 9, Line 8
ALTER TABLE ALTER COLUMN MyColumn failed because one or more objects access this column.

是否可以在不删除和重新创建依赖项的情况下更改它?

提前致谢

最佳答案

我们找到了一种方法来做到这一点。虽然这可能不是最好的解决方案,但它对我们有用,因此如果有人遇到同样的问题,请尝试以下操作:

在 SQL Server Management Studio 中,转到工具 -> 选项 -> 设计器,然后取消选中“防止保存需要重新创建表的更改”框

接下来右键单击要修改列数据类型的表,然后单击“设计”

在设计器中,将列数据类型编辑为您需要的数据类型。

最后,右键单击并选择“生成更改脚本”


它的作用如下:

  • 删除表格上的约束
  • 使用列的新数据类型创建临时表
  • 将约束读取到临时表
  • 将临时表上的 IDENTITY_INSERT 设置为 ON
  • 将旧表中的所有数据复制到新临时表
  • 将临时表上的 IDENTITY_INSERT 设置为 OFF
  • 删除旧表
  • 将临时表重命名为旧表的名称
  • 读取主键约束
  • 重新创建索引
  • 读取外键约束

此外,您还必须刷新所有相关 View 。 您可以使用此脚本生成语句:

SELECT DISTINCT 'EXEC sp_refreshview ''' + s.name + '.' + so.name + '''' AS 'dbo.TABLENAME'
FROM sys.objects AS so 
INNER JOIN sys.sql_expression_dependencies AS sed 
    ON so.object_id = sed.referencing_id 
INNER JOIN sys.schemas AS s
    ON so.schema_id = s.schema_id
WHERE so.type = 'V' AND sed.referenced_id = OBJECT_ID('dbo.TABLENAME');
  • 选中工具 -> 选项 -> 设计器中的“防止保存需要重新创建表的更改”复选框

Please be careful about this! See if it really does what you are looking for. Keep in mind that this drops the old table. Test this in a development environment!

关于sql-server - 如何在不删除依赖项的情况下更改数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37156838/

相关文章:

sql - 如何获得CTE结果的计数?

SQL 将毫秒转换为天、小时、分钟

sql-server - 将值插入动态表的存储过程

sql-server - SQL Server - 为用户创建一个新数据库,只授予他们对该数据库的访问/查看权限

sql-server - 如何让 MS SQL Server 透明地使用 CHECKSUM/哈希索引?

sql - 如何对此查询进行分组以获得所需的结果

sql-server - 以 CHARINDEX 作为长度参数的 T-SQL SUBSTRING

sql-server - SQL 手机号码验证

sql - 选择仅属于特定部门的用户

sql - 用户定义类型作为表的默认值的语法