2009-04-20 9 views

risposta

7

Una soluzione from a search: (a cura per i vincoli di default)

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

cambiando OBJECT_NAME in PARENT_OBJECT_NAME ha funzionato bene grazie. –

+0

Buona domanda. Comunque farei una correzione. La dichiarazione del cursore dovrebbe essere: SELECT NAME, parent_object_id FROM SYS.OBJECTS WHERE TYPE = 'D' AND parent_object_id = OBJECT_ID ('Mytable') –

0

Proprio perché vuoi fare questo? Eliminare i vincoli è un'azione piuttosto drastica e riguarda tutti gli utenti non solo il processo. Forse il tuo problema può essere risolto in un altro modo. Se non sei il dba del sistema, dovresti pensare molto seriamente se dovresti farlo. (Naturalmente nella maggior parte dei sistemi, un dba non consentirebbe a nessun altro i permessi di fare una cosa del genere.)

+2

Sto usando Diversi campi che devono supportare Unicode e non trovo nessun altro modo di facendo questo. quindi sto cambiando il tipo di dati delle colonne e nel processo di rilascio dei vincoli e la creazione di nuovo ....... –

4

So che questo è vecchio, ma l'ho appena trovato su google. una soluzione che funziona per me in SQL 2008 (non sicuro circa 2005) senza ricorrere a cursori è qui sotto:

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

Questo elimina solo il primo vincolo trovato (almeno questo è quello che mi ha fatto). Devi iterare attraverso tutti loro. –

+0

@Ioana Marcu: funziona per me su un database SQL 2008. Ricevo una stringa simile a quella seguente per la tabella denominata "Account" alter table Vincolo di caduta account DF__Account__Account__4865BE2A; alter table Vincolo di caduta account DF__Account__Account__4959E263 cioè un gruppo di istruzioni di rilascio concatenate – PabloInNZ