无法以编程方式删除主键 > 更改特定主键列的类型长度 > 将它们添加回主键

问题描述 投票:0回答:0

我必须增加出现在多个表中的主键的长度。我必须以编程方式执行此操作并在多个数据库中执行。 我快到了,一切都单独工作,但是当我把所有东西放在一起时,最后一行出现错误

ALTER TABLE table1 ADD PRIMARY KEY(PRIMARYKEYCOLUMN)

Msg 1911,级别 16,状态 1,第 30 行
目标表或视图中不存在列名“PRIMARYKEYCOLUMN”。

消息 1750,级别 16,状态 0,第 30 行
无法创建约束或索引。查看以前的错误。

这是整个查询

DECLARE @Col1Len varchar(100) = (SELECT character_maximum_length    
                                 FROM information_schema.columns  
                                 WHERE table_name = 'table1' 
                                   AND column_name = 'Col1')

IF (@Col1Len < 60)
BEGIN 
    DECLARE @PKs TABLE (PRIMARYKEYCOLUMN varchar(100))

    INSERT INTO @PKs (PRIMARYKEYCOLUMN) (
        SELECT column_name AS PRIMARYKEYCOLUMN
        FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC 
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU
              ON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' 
              AND TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME 
              AND KU.table_name = 'table1')

    SELECT * FROM @PKs

    DECLARE @PK varchar(100) = (SELECT name 
                                FROM sysobjects 
                                WHERE xtype = 'PK'
                                  AND parent_obj IN (SELECT id 
                                                     FROM sysobjects 
                                                     WHERE name = 'table1')
                               )

    DECLARE @Command varchar(100) = 'ALTER TABLE table1 DROP CONSTRAINT ' + @PK
    EXECUTE (@Command)  

    ALTER TABLE table1 
        ALTER COLUMN Col1 varchar(40) NOT NULL

    ALTER TABLE table1 
        ADD PRIMARY KEY(PRIMARYKEYCOLUMN)
END

如果我只运行下面的块,它会工作并且找到主键并将它们插入到@PKs 表中。

    DECLARE @PKs TABLE (
        PRIMARYKEYCOLUMN varchar(100)
    )
    Insert into @PKs (PRIMARYKEYCOLUMN) (
        SELECT column_name as PRIMARYKEYCOLUMN
        FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC 
        INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU
            ON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' 
            AND TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME 
            AND KU.table_name='table1'
    )
        SELECT * from @PKs

我做错了什么?

sql sql-server primary-key alter declare
© www.soinside.com 2019 - 2024. All rights reserved.