HI,
使用:SQL Server 数据库:Northwind
我想删除一个表主键,而不知道PK约束名称..
例如,使用Northwind示例数据库中的Categories表,主键列为'CategoryId',主键名为'PK_Categories'
我可以在知道主键名称时删除主键:
ALTER TABLE categories DROP CONSTRAINT PK_Categories;
我还可以通过表名获取表的主键名称:
select name from sysobjects where xtype = 'PK' and parent_obj = object_id('categories')
但是,我不能将它们放在一起删除表的主键,而不必先知道主键名。
我在尝试:
ALTER TABLE categories DROP CONSTRAINT
(select name from sysobjects where xtype = 'PK' and parent_obj = object_id('categories') )
有谁能告诉我哪里出错了?
非常感谢,
鲍勃
答案 0 :(得分: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
答案 1 :(得分:2)
添加到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