2009-10-19 10 views
19

HI,SQL Server: drop table klucz podstawowy, nie znając jego nazwę

Użycie: SQL Server bazy danych: Northwind

chciałbym upuść klucz podstawowy tabeli, nie wiedząc nazwą ograniczenia PK ..

np korzystając z tabeli Kategorie w bazie danych Northwind, kolumna klucz podstawowy jest „CategoryId”, a nazwa klucz podstawowy jest „PK_Categories”

mogę usunąć klucz podstawowy, wiedząc podstawowym nazwa klucza:

ALTER TABLE categories DROP CONSTRAINT PK_Categories; 

I mogę również uzyskać nazwę klucza podstawowego dla tabeli o nazwie tabeli:

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

jednak, że nie można umieścić je razem, aby usunąć klucz podstawowy tabeli, bez uprzedniego znając klucz podstawowy Nazwa.

Staram:

ALTER TABLE categories DROP CONSTRAINT 


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

Czy ktoś może mi pokazać, gdzie wezwę niewłaściwy?

Dziękujemy,

Bob

Odpowiedz

42

Będziesz musiał użyć dynamicznego SQL dla tego, ponieważ ALTER TABLE nie akceptuje zmienne lub podzapytania.

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 
+0

genialny! Próbowałem sprawdzić, czy to możliwe bez dynamicznego sql ... Bez obaw. Dziękuję Ci! –

2

Dodawanie do Stuart Ainsworth odpowiedź, ja nie wiem, czy nazwa PK musi być unikalna w obrębie różnych schematów (jeśli tak, to odpowiedź jest ok). W każdym razie wybrałbym inne zapytanie dla nazwy PK, pozwalające jednoznacznie zdefiniować schemat:

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 
+0

To świetny punkt. Zawsze zapominam o uwzględnieniu schematu. :) –