Nei*_*eil 9 sql primary-key sql-server-2008
我在80多个不同的表中有一个ReferenceID varchar(6)列.我需要在分配ID的政府组织实施更改后,将其扩展到整个数据库中的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
Run Code Online (Sandbox Code Playgroud)
然后按如下方式编辑类型:
ALTER TABLE @TableName ALTER COLUMN ReferenceID VARCHAR(8)
Run Code Online (Sandbox Code Playgroud)
这会失败,因为该列是某些表中主键的一部分(并且PK中包含的列因表而异).
我真的不想为每个表手动删除并重新创建每个PK.
在游标内,是否有办法在更改数据类型之前禁用PK然后重新启用它,或者在更改数据类型的任何一侧删除并重新创建PK,请记住PK将取决于我们在哪个表中'目前正在看?
您需要NOT NULL明确指定,ALTER TABLE ... ALTER COLUMN否则默认为允许NULL.PK列中不允许这样做.
以下工作正常.
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
Run Code Online (Sandbox Code Playgroud)
在当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.
Run Code Online (Sandbox Code Playgroud)
一对夫妇的事情在你的编程方法需要考虑的是,你将需要删除任何外键引用的ReferenceID临时列,并且确保你不包括NOT NULL用于(非PK) ReferenceID,目前列是空.
| 归档时间: |
|
| 查看次数: |
23983 次 |
| 最近记录: |