我有一个表,其中包含用户定义的数据类型为MyColumn1
的{{1}}。我需要将此列更改为CustomDatatype INT NOT NULL
,但出现以下错误:
MSG 5074,第16级,状态1,第12行
对象'CustomDatatype'依赖于列'MyColumn1'。第4级第9州第12行的4922号消息
ALTER TABLE ALTER COLUMN MyColumn1失败,因为一个或多个对象访问此列。
这似乎与我在更改列数据类型之前将要删除的索引或外键引用无关,这似乎与本列上最初使用的自定义定义的数据类型VARCHAR(5)
直接相关。
如何在不删除CustomDatatype
的情况下更改MyColumn1
的数据类型,因为这可能会在系统中创建世界末日场景或删除表?
谢谢
更新(2018-07-31):我在不同的论坛中找到了对同一问题的回答,其中指出:“ ...这是UDT列的问题。您需要首先在所有表中删除该类型的所有列(并且可能在函数/ SP,视图中),然后删除该类型并创建正确的类型,然后重新创建所有列...”(Naomi 2011)来自Microsoft(2011年8月2日)网站:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/b7bf0f04-dee8-4751-803b-4c3e1f7f7c70/how-to-change-column-nametype-of-user-defined-table-type?forum=transactsql
到目前为止,我想出的唯一可行的解决方案是:
创建表的副本(将其全部内容写成脚本) 依赖项,即:触发器,索引,键等)。 表(即使指定了自定义数据类型也可以这样做),然后使用新的数据类型列再次重新创建该表。
如果由于某些原因无法删除表,请重命名旧表 数据类型列,使用原始列名创建一个新列 具有正确的数据类型。从旧的(重命名)列中移动数据 放入新的(请务必注意触发器等)。然后用力 重新编译所有Sproc并刷新所有视图
答案 0 :(得分:0)
您可以检查是否为这些列添加了索引吗?
如果是,
您将需要拖放并重新创建索引。
一旦删除约束和索引,就可以更改列。
alter table Table1
alter column MyColumn1 varchar(5);
然后重新创建约束和索引。
答案 1 :(得分:0)
到目前为止,我想出的唯一可行的解决方案是:
1)创建表的副本(使用所有依赖项(包括触发器,索引,键等)将其脚本化)删除原始表(即使指定了自定义数据类型也可以这样做),然后重新创建再次使用新的数据类型列。
2)如果由于某种原因无法删除表,请重命名旧的数据类型列,请使用具有正确数据类型的原始列名称创建一个新列。将数据从旧的(重命名)列移到新的列(请确保注意触发器等)。然后强制重新编译所有Sproc,并刷新所有依赖的视图。