sqlsql-serverprimary-key

SQL Server: drop table primary key, without knowing its name


Using: SQL Server Database: Northwind

I'd like to drop a table primary key, without knowing the PK constraint name.

E.g., using the Categories table in the Northwind Sample database, the primary key column is 'CategoryId', and the primary key name is 'PK_Categories'.

I can drop the primary key while knowing the primary key name:

ALTER TABLE categories DROP CONSTRAINT PK_Categories;

And I can get the primary key name for the table by table name:

select name from sysobjects
where xtype = 'PK' and parent_obj = object_id('categories')

However, I cannot put them together to delete a table's primary key, without first knowing the primary key name.

I am trying:

ALTER TABLE categories DROP CONSTRAINT
 (select name 
   from sysobjects 
  where xtype = 'PK' 
    and parent_obj = object_id('categories') ) 

Where am I going wrong?


Solution

  • You'll have to use dynamic SQL for that, since ALTER TABLE does not accept variables or subqueries.

    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