2009-04-20 16 views

答えて

7

一つの解決策from a search:(既定の制約のために編集)

SET NOCOUNT ON 

DECLARE @constraintname SYSNAME, @objectid int, 
      @sqlcmd   VARCHAR(1024) 

DECLARE CONSTRAINTSCURSOR CURSOR FOR 
SELECT NAME, object_id 
FROM SYS.OBJECTS 
WHERE TYPE = 'D' AND @objectid = OBJECT_ID('Mytable') 

OPEN CONSTRAINTSCURSOR 

FETCH NEXT FROM CONSTRAINTSCURSOR 
INTO @constraintname, @objectid 

WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SELECT @sqlcmd = 'ALTER TABLE ' + OBJECT_NAME(@objectid) + ' DROP CONSTRAINT ' + @constraintname 
    EXEC(@sqlcmd) 
    FETCH NEXT FROM CONSTRAINTSCURSOR 
    INTO @constraintname, @objectid 
END 

CLOSE CONSTRAINTSCURSOR 
DEALLOCATE CONSTRAINTSCURSOR 
+0

OBJECT_NAMEからPARENT_OBJECT_NAMEに変更するとうまくいった。 –

+0

良いクエリです。私はしかし、修正を行います。 SELECT NAME、parent_object_id FROM SYS.OBJECTS WHERE TYPE = 'D' AND parent_object_id = 'Mytable') –

0

ただ、なぜあなたはこれをしたいですか?制約を破棄するのはかなり劇的なアクションであり、プロセスだけでなくすべてのユーザーに影響します。多分あなたの問題は他の方法で解決することができます。あなたがシステムのdbaでないなら、あなたはこれを行うべきかどうかについて非常に懸命に考えるべきです。 (もちろん、ほとんどのシステムでは、dbaは他の誰にもそのようなことを許可することはできません。)

+2

私はUnicodeをサポートする必要があるいくつかのフィールドを使用しています。これを行う。したがって、私は列のデータ型を変更しており、処理中に制約を破棄して再度作成しています....... –

4

私はこれは古いですが、私はグーグルでそれを見つけました。 カーソルに頼ることなくSQL 2008(2005わからない)に私の作品解決策は以下の通りです:

declare @sql nvarchar(max) 

set @sql = '' 

select @sql = @sql + 'alter table YourTable drop constraint ' + name + ';' 
from sys.default_constraints 
where parent_object_id = object_id('YourTable') 
AND type = 'D' 

exec sp_executesql @sql 
+0

これは最初に見つかった制約(少なくともそれが私にしたことです)だけを削除します。あなたはそれらのすべてを反復する必要があります。 –

+0

@ Ioana Marcu:SQL 2008データベースで私の仕事。私は 'Account'というテーブルのために以下のような文字列を取得するalter tableアカウントのドロップ制約DF__Account__Account__4865BE2A; alter tableアカウントのドロップ制約DF__Account__Account__4959E263つまり連結されたドロップステートメントの束 – PabloInNZ