SQL Drop Index在不同的数据库上

时间:2010-06-01 18:07:01

标签: sql sql-server sql-server-2005 indexing

在尝试优化SQL脚本时,我建议添加索引。

指定索引应该使用的数据库的最简单方法是什么?

IF EXISTS (SELECT * FROM sysindexes WHERE NAME = 'idx_TableA')  
  DROP INDEX TableA.idx_TableA 

IF EXISTS (SELECT * FROM sysindexes WHERE NAME = 'idx_TableB')  
  DROP INDEX TableB.idx_TableB 

在上面的代码中,TableA在DB-A中,TableB在DB-B中。

DROP INDEX TableA.idx_TableA更改为DROP INDEX DB-A.dbo.TableA.idx_TableA

时出现以下错误
Msg 166, Level 15, State 1, Line 2
'DROP INDEX' does not allow specifying the database name as a prefix to the object name.

任何想法都表示赞赏。

5 个答案:

答案 0 :(得分:7)

如果要在不同的数据库上删除索引,则删除命令必须使用USE语句。

USE [DatabaseName]
Drop Index [IndexName]

答案 1 :(得分:7)

如果您有权限,另一种方法是使用EXEC('sql')。另请注意,在查询sys.indexes时,需要使用数据库名称作为前缀:

IF EXISTS (SELECT * FROM [DB-A].sys.indexes WHERE name = 'idx_TableA')
  EXEC('USE [DB-A]; DROP INDEX TableA.idx_TableA')

IF EXISTS (SELECT * FROM [DB-B].sys.indexes WHERE name = 'idx_TableB')
  EXEC('USE [DB-B]; DROP INDEX TableB.idx_TableB')

答案 2 :(得分:4)

如果您不能发出USE:

EXEC [DB-A].dbo.sp_executesql N'DROP INDEX TableA.idx_TableA'

答案 3 :(得分:0)

您也可以输入索引名称。

IF EXISTS (select 1 from sysindexes i, sysobjects o where o.name = 'idx_TableA'
and o.id = i.id and i.name='indexname')
     exec('use [db-a]; drop index idx_TableA.indexname')
     SELECT 'Drop the index'
else
     SELECT 'Index not found'

答案 4 :(得分:0)

使用DROP INDEX ... ON语法。这支持指定数据库和表名:http://msdn.microsoft.com/en-us/library/ms176118.aspx。您使用的缩写语法已弃用,并且将在未来版本的Microsoft SQL Server中删除"。

IF EXISTS (SELECT * FROM [DB-A].sys.indexes WHERE NAME = 'idx_TableA')  
  DROP INDEX [idx_TableA] ON [DB-A].dbo.[TableA]

IF EXISTS (SELECT * FROM [DB-B].sys.indexes WHERE NAME = 'idx_TableB')  
  DROP INDEX [idx_TableB] ON [DB-B].dbo.[TableB]