2009-10-19 27 views
19

HI、SQL Serverの:SQL Serverの データベース:使用して、その名前

を知らなくても、テーブルの主キーをドロップするノースウィンド

を私はPK制約名を知らなくても、テーブルの主キーを削除したいのですが..

例えば、NorthwindサンプルデータベースにCategoriesテーブルを使用して、主キー列は「区分」であり、主キーの名前は「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

あなたは、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 
+0

素晴らしいです!私は動的SQLなしで可能だったかどうか試していた...いいえ心配しないでください。ありがとうございました! –

2

スチュアート・エインズワースの回答に追加すると、異なるスキーマ間でPK名が一意である必要があるかどうかわかりません(その場合、その答えはOKです)。とにかく私はスキーマを明示的に定義することを可能にする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

それは大きなポイントです。私は常にスキーマを説明することを忘れています。 :) –

関連する問題