Una delle prime soluzioni a cui si potrebbe arrivare è ciclare sulle liste di oggetti restituite dalle varie information_schema. Ma SQL è concepito per pensare "set based" e quindi potremmo sfruttare questa sua caratteristica per riuscire a formattare con un'unica query le istruzioni di drop.
Con lo script seguente otteniamo esattamente ciò che ci siamo prefissati, un'unica query che mi restituisca tutte le istruzioni di drop necessarie.
Le istruzioni saranno poi eseguite grazie alla EXEC.
DECLARE @strSql VARCHAR(MAX) = '' SET @strSql = ( SELECT 'DROP ' + OBJTYPE + ' [' + OBJSCHEMA + '].[' + OBJNAME + ']; ' FROM ( SELECT ROUTINE_TYPE OBJTYPE,ROUTINE_SCHEMA OBJSCHEMA, ROUTINE_NAME OBJNAME FROM INFORMATION_SCHEMA.ROUTINES UNION SELECT TABLE_TYPE, TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW' ) OBJ FOR XML PATH ('') ) EXEC(@strSql)
Vi consiglio di approfondire la "FOR XML PATH('')" che potrebbe tornare molto utile....
Ciao
Luca
Ciao,
RispondiEliminaun metodo alternativo per ottenere lo stesso risultato lo si può ottenere utilizzando le CTE.
Qui di seguito un esempio:
/* VARIABILE CHE CONTERRA' I COMANDI DA ESEGUIRE */
DECLARE @s AS varchar(MAX);
/* INIZIALIZZO LA VARIABILE PER NON AVERE PROBLEMI DI NULL */
SET @s = '';
/* ESTRAZIONE - CONCATENAZIONE DEI COMANDI DA ESEGIORE */
WITH CTE AS
(
SELECT ROUTINE_TYPE, ROUTINE_SCHEMA, ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES
UNION
SELECT TABLE_TYPE, TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW'
)
SELECT @s = @s + ('DROP ' + ROUTINE_TYPE + ' [' + ROUTINE_SCHEMA + '].[' + ROUTINE_NAME + ']; ') FROM CTE
ORDER BY ROUTINE_TYPE
/* ESECUZIONE DEL COMANDO */
--PRINT (@s)
EXEC(@s)
Ciao
Nicola