2009-10-19 1 views
19

HI,SQL Server: падение ключ таблицы первичный, не зная его имя

Использование: SQL Server базы данных: Борей

Я хотел бы, чтобы понизить первичный ключ таблицы, не зная имя ограничения PK ..

например, используя таблицу категорий в базе данных Борей, столбец первичного ключа является «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')) 

Может кто-нибудь показать мне, где я неправильно?

Большое спасибо,

Боб

ответ

42

Вам придется использовать динамический 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 
+0

блестящий! Я пытался посмотреть, возможно ли это без динамического sql ... Не беспокойтесь. Спасибо! – 2009-10-20 08:21:43

2

Добавление к Стюарт Эйнсворт ответ, я не знаю, если имя ПК должен быть уникальным по различным схемам (если это так, то ответ ОК). Во всяком случае, я бы выбрал другой подзапрос для имени 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 
+0

Это отличная точка. Я всегда забываю учитывать схему. :) –