2009-04-20 15 views

Respuesta

7

Una solución from a search: (editado por restricciones predeterminadas)

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 a PARENT_OBJECT_NAME funcionó bien gracias. –

+0

Buena consulta. Me gustaría hacer una corrección sin embargo. La declaración del cursor debe ser: SELECT NAME, parent_object_id FROM SYS.OBJECTS WHERE TYPE = 'D' AND parent_object_id = OBJECT_ID ('Mytable') –

0

Justo ¿Por qué quieres hacer esto? La caída de restricciones es una acción bastante drástica y afecta a todos los usuarios, no solo a su proceso. Tal vez su problema se puede resolver de otra manera. Si no eres el dba del sistema, deberías pensar muy bien si deberías hacer esto. (Por supuesto, en la mayoría de los sistemas, un dba no le permitiría a nadie más los permisos para hacer tal cosa.)

+2

Estoy usando varios campos que necesitan soportar Unicode y no encuentro ninguna otra forma de haciendo esto. por lo tanto, estoy cambiando el tipo de datos de las columnas y en proceso eliminando las restricciones y volviendo a crearlas ....... –

4

Sé que esto es viejo, pero lo encontré cuando busqué en Google. una solución que funciona para mí en SQL 2008 (no estoy seguro de 2005) sin tener que recurrir a los cursores es a continuación:

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

Esto solo borra la primera restricción encontrada (al menos eso es lo que me hizo). Tienes que iterar a través de todos ellos. –

+0

@Ioana Marcu: funciona para mí en una base de datos SQL 2008. Obtengo una cadena similar a la siguiente para la tabla llamada "Cuenta" después de la tabla Account drop constraint DF__Account__Account__4865BE2A; alter table Account Drop constraint DF__Account__Account__4959E263 es decir, un montón de sentencias drop concatenadas – PabloInNZ

Cuestiones relacionadas