[SQL Server] Multiple indexes droppen*

Pagina: 1
Acties:

  • Palthe
  • Registratie: Juni 2002
  • Laatst online: 12-04 15:26
Ik wil graag een drop index tabelnaam.indexnaam
doen voor meerdere indexen.

de indexen haal ik uit de sysindexes met :

SELECT name FROM sysindexes
WHERE id in (SELECT ID FROM sysobjects WHERE name = 'tabelnaam')

Dit gaat prima. Ik krijg alle relevante indexen naar voren.

Maar nu wil ik met 1 query ALLE indexen in 1 keer droppen.
Kan dit en zo ja hoe?

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Kan niet in 1 statement (tenzij je met cursors gaat werken en 'vieze' exec() statements ;)).

Maar waarom niet gewoon:
code:
1
2
SELECT 'DROP INDEX tabelnaam.' + name FROM sysindexes
WHERE id in (SELECT ID FROM sysobjects WHERE name = 'tabelnaam')

En dan het resultaat gebruiken.


Edit:
kom deze nog tegen via google

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/******************************
DROP Indexes
******************************/

PRINT ''
PRINT ''
PRINT ''
PRINT '**********************'
PRINT '* Dropping Indexes *'
PRINT '**********************'
SET NOCOUNT ON

DECLARE @IndexNames TABLE(IndexName nvarchar(256))
DECLARE @IndexCount int
DECLARE @IndexName nvarchar(256)


INSERT @IndexNames (IndexName)
SELECT o.name + '.' + i.name AS IndexName
FROM sysindexes i, sysobjects o
WHERE i.indid > 0
AND i.indid < 255
AND (i.status & 64) = 0
AND i.id = o.id
AND o.type = 'U'
AND OBJECTPROPERTY(o.id, 'IsSystemTable') =0
AND OBJECTPROPERTY(o.id, 'IsConstraint') = 0


SELECT @IndexCount = Count(*) FROM @IndexNames

WHILE @IndexCount > 0
BEGIN
SET @IndexName = NULL

SELECT @IndexName = MIN(IndexName)
FROM @IndexNames

IF @IndexName <> 'NxT_Version.PK_NxT_Version'
BEGIN
EXECUTE('DROP INDEX ' + @IndexName)
PRINT ' Dropping Index ' + @IndexName
END


DELETE FROM @IndexNames WHERE IndexName = @IndexName

SET @IndexCount = @IndexCount - 1
END
SET NOCOUNT OFF
GO

[ Voor 77% gewijzigd door Annie op 24-01-2006 15:09 ]

Today's subliminal thought is:


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 21:47

pistole

Frutter

en anders een cursortje openen met het resultaat van je 1e query, en dan een nieuwe statement bouwen en uitvoeren met sp_executesql...

Ik frut, dus ik epibreer


  • Palthe
  • Registratie: Juni 2002
  • Laatst online: 12-04 15:26
ok met bovenstaande kom ik al weer veel verder. Ik kom er niet onderuit dat ik toch 2 of meer stappen moet uitvoeren om dit te bewerkstelligen. ik wil eigenlijk gewoon een script dat dit kan uitvoeren, dus met jullie input kan ik al heel wat verder. Dank.

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 21:47

pistole

Frutter

misschien heb je hier nog iets aan; een stukje t-sql dat ik geschreven heb om alle indexen van een tabel te herindexeren:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
declare @cmd nvarchar(1024)
declare @cmdt nvarchar(1024)
declare @index nvarchar(255)

select @cmdt='dbcc indexdefrag (dbname, tablename, indexname)'

declare curIndex cursor for
    select i.name from sysobjects t inner join sysindexes i on t.id=i.id where t.name='tablename' and i.name<>'tablename' and i.rows>0

open curIndex
fetch next from curIndex into @index

while @@FETCH_STATUS=0
begin
    select @cmd=replace(@cmdt, 'indexname', @index)
    print 'EXEC: '+@cmd
    EXECUTE sp_executesql @cmd
    fetch next from curIndex into @index
end
close curIndex
deallocate curIndex

Ik frut, dus ik epibreer