Ciao ragazzi 
Ho la necessità di creare uno script di sql che elimini in automatico tutte le relazioni, i vincoli e le chiavi delle tabelle di un dato database.
Questo perchè ho poi la necessità di effettuare delle modifiche alle colonne di alcune tabelle.
Lo so, sarebbe più facile farlo a mano, ma purtroppo devo creare un tool di manutenzione dei database e quindi necessito di procedure.
Al momento ho scritto questo:
codice:
USE 'Sitt2_Sud_ConfigurationDB'
-- creare array con elenco tabelle
-- creare array con elenco indice tabella
-- cancellare ogni elemento del precedente array
-- creo l'array e lo riempio con i nomi delle tabelle
DECLARE @table_name VARCHAR(50) = ''
DECLARE @index_name VARCHAR(255) = ''
DECLARE table_cursor CURSOR LOCAL FAST_FORWARD FOR
--legge i nomi delle tabelle
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE (TABLE_TYPE not like 'view%') AND
(TABLE_NAME NOT IN(select TABLE_NAME FROM
INFORMATION_SCHEMA.TABLE_PRIVILEGES))FOR READ ONLY
OPEN table_cursor
FETCH table_cursor INTO @table_name
WHILE (@@fetch_status <> -1)
BEGIN
-- creo ed eseguo il ciclo sugli indici
DECLARE index_cursor CURSOR FOR
EXEC sp_helpindex '@table_name'
OPEN index_cursor
FETCH table_cursor INTO @index_name
WHILE (@@fetch_status <> -1)
BEGIN
DROP INDEX @table_name.@index_name
END
-- mi sposto sulla tabella successiva
FETCH table_cursor INTO @table_name
CLOSE index_cursor
DEALLOCATE index_cursor
END
CLOSE table_cursor
DEALLOCATE table_cursor
Ho in particolare 2 problemi.
Effettuo una select per caricare un cursore contenente l'elenco di tutte le tabelle presenti nel database.
Avvio il ciclo su questo cursore e ad ogni giro carico un nuovo cursore contenente l'elenco degli indici relativi alla suddetta tabella.
- Primo problema: l'istruzione che utilizzo per leggere l'elenco degli indici è: sp_helpindex '@table_name' (in rosso nel codice postato)
Il problema è che ovviamente non è possibile eseguire una stored procedure così come l'ho scritta io; anzi, non so nemmeno se sia possibile farlo all'interno di un ciclo.
Qualora però sbagliassi non conosco la sintassi, quindi la mia prima domanda è: esiste una sintassi corretta x eseguire questa istruzione o un'altra istruzione equivalente?
- Secondo problema che mi si pone è l'eliminazione dell'indice trovato.
L'istruzione che utilizzo è la DROP INDEX alla quale passo le variabili contenenti il nome della tabella e il nome dell'indice: DROP INDEX @table_name.@index_name (in rosso nel codice postato).
Chiaramente non funziona, e non so perchè. Anche qui, sbaglio a scrivere qualcosa o il problema è altrove?
Grazie a tutti
lady