Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在不删除依赖项的情况下更改数据类型_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

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生成的脚本。因为我们必须在很多表上执行此操作,所以我们需要一种编写脚本的方法。但你可能是对的,它也可能像这样工作