我在80多个不同的表中都有一个ReferenceIDvarchar(6)列。我需要在分配ID的政府组织实施更改之后,将其扩展到整个db的varchar(8)。
我希望声明一个游标以获取表名,如下所示:
DECLARE @TableName AS VARCHAR(200) DECLARE TableCursor CURSOR LOCAL READ_ONLY FOR SELECT t.name AS TableName FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id WHERE c.name = 'ReferenceID' OPEN TableCursor FETCH NEXT FROM TableCursor INTO @TableName
然后按如下所示编辑类型:
ALTER TABLE @TableName ALTER COLUMN ReferenceID VARCHAR(8)
之所以失败,是因为该列是某些表中主键的一部分(并且PK中包含的列因表而异)。
我真的不想不必为每个表手动删除并重新创建每个PK。
在游标中,有一种方法可以在更改数据类型之前先禁用PK,然后重新启用它,或者在更改数据类型的任一侧删除并重新创建PK,请记住PK将取决于我们使用的表目前正在看吗?
您需要在中NOT NULL明确指定,ALTER TABLE ... ALTER COLUMN否则默认为allow NULL。PK列中不允许这样做。
NOT NULL
ALTER TABLE ... ALTER COLUMN
NULL
以下工作正常。
CREATE TABLE p ( ReferenceID VARCHAR(6) NOT NULL PRIMARY KEY ) INSERT INTO p VALUES ('AAAAAA') ALTER TABLE p ALTER COLUMN ReferenceID VARCHAR(8) NOT NULL
当NOT NULL省略时,会出现以下错误
Msg 5074, Level 16, State 1, Line 1 The object 'PK__p__E1A99A792180FB33' is dependent on column 'ReferenceID'. Msg 4922, Level 16, State 9, Line 1 ALTER TABLE ALTER COLUMN ReferenceID failed because one or more objects access this column.
一对夫妇的事情在你的编程方法需要考虑的是,你 将 需要删除任何外键引用的ReferenceID临时列,并且确保你不包括NOT NULL用于(非PK) ReferenceID,目前列 是 空。
ReferenceID