SQL Server 2005 - Istruzione SQL per rimuovere le chiavi raggruppate dalle tabelle in base a una query sui nomi di tabulazione?
-
10-07-2019 - |
Domanda
Sto provando a ripristinare un backup di un database Microsoft Dynamics NAV, che sfortunatamente fallisce mentre tenta di impostare un CLUSTERED KEY per le tabelle che hanno già le chiavi in ??cluster.
In NAV, ogni azienda nel database ottiene la propria copia delle tabelle, preceduta dal nome dell'azienda, ad es. AZIENDA $ User_Setup
. Vorrei quindi rimuovere qualsiasi chiave cluster di una determinata azienda, il che significa che su qualsiasi tabella il cui nome inizia con "Azienda $".
Qualcuno ha un'istruzione SQL in grado di eseguire ciò?
Grazie in anticipo!
Cordiali saluti, Martin
Soluzione
Dovrai farlo come un cursore. Supponendo che ogni vincolo PK sia denominato in modo coerente e sia basato sul nome della tabella, si sarebbe in grado di fare qualcosa del genere (non testato, quindi potrebbe contenere errori di battitura o errori di sintassi vauge):
DECLARE mycursor CURSOR FOR SELECT name FROM sysobjects WHERE name LIKE 'Company$%'
OPEN CURSOR
FETCH NEXT FROM mycursor INTO @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = N'ALTER TABLE QUOTENAME(' + @tablename + ') DROP CONSTRAINT PK_' + @tablename
EXEC sp_ExecuteSQL @sql
FETCH NEXT FROM mycursor INTO @tablename
END
CLOSE CURSOR
DEALLOCATE CURSOR
Se i tuoi PK non hanno un nome basato su tablename, allora dovrai modificarlo per eseguire una query anche su sysconstraints o sysindexes per ottenere il nome PK effettivo.