Подтвердить что ты не робот

SQL Server: первичный ключ drop table, не зная его имени

HI,

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

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

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

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

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

Боб

4b9b3361

Ответ 1

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

Ответ 2

Добавляя к ответу Стюарта Айнсворта, я не знаю, должно ли имя 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