2013-04-03 6 views
9

Sto provando a scrivere script per rimuovere i vincoli.Rilascia tutti i vincoli in una tabella

ho la funzione di seguito per selezionare le Constarints nel mio database

SELECT name 
    FROM sys.foreign_keys 

E mi hanno scritto sceneggiature alter utilizzando gli script di cui sopra

SELECT 
    'ALTER TABLE ' + OBJECT_NAME(parent_object_id) + 
    ' DROP CONSTRAINT ' + name 
FROM sys.foreign_keys 

Utilizzando la query di cui sopra come posso eseguire questi vincoli ?

Posso usare DROP DATABASE DBName. Ma sto solo cercando di eliminare i tavoli facendo cadere Vincoli.

è possibile senza SP? O qualche modo facile posso procedere?

+0

Controllare il commento in questo [articolo] [1]. [1]: http://stackoverflow.com/a/6130023/2232256 – dferidarov

risposta

29

Bene, è sempre possibile copiare l'output dal riquadro inferiore, incollarlo nel riquadro superiore e premere F5. Oppure si può costruire una stringa per eseguire direttamente:.

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql += N' 
ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) 
    + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + 
    ' DROP CONSTRAINT ' + QUOTENAME(name) + ';' 
FROM sys.foreign_keys; 

PRINT @sql; 
-- EXEC sp_executesql @sql; 

(Quando si è soddisfatti del PRINT uscita, commentare fuori e rimuovere il commento dalla EXEC Si noti che l'output di stampa verrà troncato a 8K in Management Studio, ma il la variabile contiene davvero l'intero comando.)

Inoltre, non so come questo si riferisca realmente al fatto che si stia utilizzando una procedura memorizzata o no, o perché si stia tentando di farlo "w/o andando per SP". .. questa query può essere eseguita come stored procedure o no, tutto dipende da quanto spesso lo chiamerai, dove risiede la procedura, ecc.

+0

Grazie @Aaron. questo è esattamente quello che stavo cercando. Ya ti converto in SP come hai detto – user2067567

+0

Nella tua query precedente + = si riferisce al loop? Come funziona? – user2067567

+0

Sì, si tratta essenzialmente di concatenazione di stringhe su ogni riga del risultato. Si potrebbe anche dire 'SELECT @sql = @sql + N '...' infatti è così che si doveva farlo in SQL Server 2005. Questa è la sintassi più recente introdotta in SQL Server 2008. –

15

questo ha lavorato per me in SQL Server 2008:

DECLARE @SQL NVARCHAR(MAX) = N''; 

SELECT @SQL += N' 
ALTER TABLE ' + OBJECT_NAME(PARENT_OBJECT_ID) + ' DROP CONSTRAINT ' + OBJECT_NAME(OBJECT_ID) + ';' 
FROM SYS.OBJECTS 
WHERE TYPE_DESC LIKE '%CONSTRAINT' AND OBJECT_NAME(PARENT_OBJECT_ID) = 'YOUR_TABLE'; 

PRINT @SQL 
--EXECUTE(@SQL) 

Naturalmente, rimuovere il commento le EXECUTE(@SQL) quando è pronto per l'esecuzione

+0

Risposta perfetta Ha funzionato per me anche ... Grazie mille –

+0

Preferisco questo perché mostra come indirizzare tabelle specifiche se questo è il tuo obiettivo. – AS7K

0

la domanda corretta contrassegnato non funziona per me. Ma questo funziona per me in SQL Server 2017:

DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql += N' 
ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) 
    + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + 
    ' DROP CONSTRAINT ' + QUOTENAME(name) + ';' 
FROM sys.objects 
WHERE type_desc LIKE '%CONSTRAINT' 
    AND OBJECT_NAME(PARENT_OBJECT_ID) LIKE 'your_table_name'; 

EXEC sp_executesql @sql; 
+1

Mentre questo post solo codice potrebbe rispondere alla domanda, si prega di aggiungere una spiegazione del perché lo fa. Ciò aiuterà i futuri lettori a valutare la risposta alla loro situazione. –