There was a question in the german Xbase++ Forum how to drop all indexes for a given table in ADS if the table is part of a data dictionary (just deleting the index file won’t work in that case). The easiest way is to use SQL:
DECLARE @tablename STRING; DECLARE @indexes CURSOR as SELECT Name FROM system.indexes WHERE Parent LIKE @tablename; @tablename='test'; OPEN @indexes; WHILE FETCH @indexes DO EXECUTE IMMEDIATE 'DROP INDEX ['+trim(@tablename)+'].['+trim(@indexes.Name)+']'; END WHILE; CLOSE @indexes;
If an index can’t be dropped (e.g. because it’s being used for a referential integrity rule), the whole script will fail with an exception. This might leave the index in a intermediate state (some indexes are droppped, others not). You can put TRY/CATCH clauses around the DROP command just to fail with un-dropable (is this the right english term?) indexes but still drop all others. And if you need this more than once, you should consider implementing it as a stored procedure:
CREATE PROCEDURE DropAllIndexes( tablename CICHAR(255), indexname MEMO OUTPUT, result logical OUTPUT, errormessage MEMO OUTPUT) BEGIN DECLARE @tablename STRING; DECLARE @indexname STRING; DECLARE @indexes CURSOR as SELECT Name FROM system.indexes WHERE Parent LIKE @tablename; @tablename=_tablename; OPEN @indexes; WHILE FETCH @indexes DO TRY @indexname='['+trim(@tablename)+'].['+trim(@indexes.Name)+']'; EXECUTE IMMEDIATE 'DROP INDEX '+@indexname; INSERT INTO __output VALUES (@indexname, true, ''); CATCH ALL INSERT INTO __output VALUES (@indexname, false, __errtext); END TRY; END WHILE; CLOSE @indexes; END;
Usage:
EXECUTE PROCEDURE DropAllIndexes('test');
Drop all indexes for a given table