2009-04-20 6 views

Répondre

7

Une solution from a search: (sous la direction des contraintes par défaut)

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

La modification de OBJECT_NAME en PARENT_OBJECT_NAME a bien fonctionné. –

+0

Bonne requête. Je voudrais faire une correction si. La déclaration du curseur doit être: SELECT NAME, parent_object_id FROM SYS.OBJECTS WHERE TYPE = 'D' ET parent_object_id = OBJECT_ID ('Mytable') –

0

Juste pourquoi voulez-vous faire? La suppression des contraintes est une action assez drastique qui affecte tous les utilisateurs, pas seulement votre processus. Peut-être que votre problème peut être résolu d'une autre manière. Si vous n'êtes pas le dba du système, vous devriez réfléchir très sérieusement à savoir si vous devriez le faire. (Bien sûr, dans la plupart des systèmes, un dba n'autoriserait personne d'autre à faire une telle chose.)

+2

J'utilise plusieurs champs qui doivent prendre en charge Unicode et je ne trouve pas d'autre moyen de Ce faisant. donc je suis en train de changer le type de données des colonnes et en train de supprimer les contraintes et de les créer à nouveau ... –

4

Je sais que c'est ancien, mais je l'ai trouvé lors de la recherche sur Google. Une solution qui fonctionne pour moi dans SQL Server 2008 (pas sûr 2005) sans avoir recours à des curseurs est ci-dessous:

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

Ceci supprime seulement la première contrainte trouvée (du moins c'est ce que ça m'a fait). Vous devez itérer à travers chacun d'eux. –

+0

@Ioana Marcu: Fonctionne pour moi sur une base de données SQL 2008. Je reçois une chaîne semblable à ci-dessous pour la table appelée 'Compte' alter table Contrainte de dépôt de compte DF__Account__Account__4865BE2A; alter table Contrainte de dépôt de compte DF__Account__Account__4959E263 c'est-à-dire un groupe d'instructions drop concaténées – PabloInNZ

Questions connexes