SQL Server:删除表主键,不知道其名称

24 sql sql-server primary-key

HI,

使用:SQL Server数据库:Northwind

我想删除一个表主键,而不知道PK约束名称..

例如,使用Northwind示例数据库中的Categories表,主键列为'CategoryId',主键名为'PK_Categories'

我知道主键名称时可以删除主键:

ALTER TABLE categories DROP CONSTRAINT PK_Categories;
Run Code Online (Sandbox Code Playgroud)

我还可以通过表名获取表的主键名称:

select name from sysobjects where xtype = 'PK' and parent_obj = object_id('categories')
Run Code Online (Sandbox Code Playgroud)

但是,我不能将它们放在一起删除表的主键,而不必先知道主键名.

我在尝试:

ALTER TABLE categories DROP CONSTRAINT


(select name from sysobjects where xtype = 'PK' and parent_obj = object_id('categories') ) 
Run Code Online (Sandbox Code Playgroud)

有谁能告诉我哪里出错了?

非常感谢,

短发

Stu*_*rth 52

您必须使用动态SQL,因为ALTER TABLE不接受变量或子查询.

CREATE TABLE PKTest ( ID INT PRIMARY KEY ) ;

DECLARE @SQL VARCHAR(4000)
SET @SQL = 'ALTER TABLE PKTEST DROP CONSTRAINT |ConstraintName| '

SET @SQL = REPLACE(@SQL, '|ConstraintName|', ( SELECT   name
                                               FROM     sysobjects
                                               WHERE    xtype = 'PK'
                                                        AND parent_obj = OBJECT_ID('PKTest')
                                             ))

EXEC (@SQL)

DROP TABLE PKTest
Run Code Online (Sandbox Code Playgroud)


Prz*_*min 5

添加到 Stuart Ainsworth 的答案中,我不知道 PK 名称是否必须在不同的模式中是唯一的(如果是这样,该答案是可以的)。无论如何,我会为 PK 名称选择不同的子查询,允许明确定义架构:

declare @PrimaryKeyName sysname = 
    (select CONSTRAINT_NAME 
     from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
     where CONSTRAINT_TYPE = 'PRIMARY KEY' and TABLE_SCHEMA='dbo' and TABLE_NAME = 'PKTest'
    )

IF @PrimaryKeyName is not null
begin
    declare @SQL_PK NVARCHAR(MAX) = 'alter table dbo.PKTest drop constraint ' + @PrimaryKeyName
    print (@SQL_PK)
    EXEC sp_executesql @SQL_PK;
end
Run Code Online (Sandbox Code Playgroud)