web-dev-qa-db-ja.com

SQL Server:名前を知らずにテーブルの主キーを削除する

こんにちは、

使用:SQL Serverデータベース:Northwind

PK制約名を知らずにテーブルの主キーを削除したいのですが。

たとえば、Northwind Sampleデータベースの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') ) 

誰かが私がどこで間違っているのか教えてもらえますか?

どうもありがとう、

ボブ

24
Bob

ALTER TABLEは変数またはサブクエリを受け入れないため、そのために動的SQLを使用する必要があります。

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
52

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
2