是否可以更改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/