Sql server 如何在不删除依赖项的情况下更改数据类型
是否可以更改Sql server 如何在不删除依赖项的情况下更改数据类型,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,是否可以更改十进制列的精度而不删除并重新创建其依赖项 我尝试了以下方法: 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"
十进制
列的精度而不删除并重新创建其依赖项
我尝试了以下方法:
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,第16级,状态1,第8行对象“MyView”依赖于列“MyColumn” Msg 5074,第16级,状态1,第8行
索引“MyIndex”依赖于列“MyColumn” 味精4922,第16级,第9状态,第8行
ALTER TABLE ALTER COLUMN由于一个或多个对象访问此列而失败 是否可以在不删除和重新创建依赖项的情况下对其进行更改
提前感谢我们找到了这样做的方法。虽然这可能不是最好的解决方案,但它对我们有效,因此,如果有人有相同的问题,请尝试以下方法:
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"
在SQLServerManagementStudio中,转到工具->选项->设计器
并取消选中中的“防止保存需要重新创建表的更改”框
接下来,右键单击要修改列数据类型的表,然后单击“设计”
在设计器中,将列数据类型编辑为所需的数据类型
最后,右键单击并选择“生成更改脚本”
它的作用如下:
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"
- 将约束放到表上
- 使用列的新数据类型创建临时表
- 读取到临时表的约束
- 将临时表上的
设置为IDENTITY\u INSERT
on
- 将所有数据从旧表复制到新临时表
- 将临时表上的
设置为IDENTITY\u INSERT
OFF
- 扔掉那张旧桌子
- 将临时表重命名为旧表的名称
- 读取主键约束
- 重新创建索引
- 读取外键约束
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');
- 选中
Tools->Options->Designer
不,不可能这样做。问题:为什么删除表并使用所有约束重新创建它比删除约束、更改列并重新创建约束要好?是的,好问题,我只描述了Sql Server Management Studio生成的脚本。因为我们必须在很多表上执行此操作,所以我们需要一种编写脚本的方法。但你可能是对的,它也可能像这样工作