Pagine

martedì 21 giugno 2011

Come Eliminare SP,View e Function dinamicamente

Delle volte potrebbe essere utile eliminare tutte le Stored procedure, Viste e funzioni contenute nel database.
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

1 commento:

  1. Ciao,
    un 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

    RispondiElimina