SQL Drop Index在不同的数据库上

Jim*_*Jim 4 sql sql-server indexing sql-server-2005

在尝试优化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 
Run Code Online (Sandbox Code Playgroud)

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

我收到以下错误,当我改变DROP INDEX TableA.idx_TableADROP 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.
Run Code Online (Sandbox Code Playgroud)

任何想法都表示赞赏.

Joh*_*ock 7

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

USE [DatabaseName]
Drop Index [IndexName]
Run Code Online (Sandbox Code Playgroud)


Tom*_*m H 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')
Run Code Online (Sandbox Code Playgroud)


Als*_*sin 5

如果您不能发出 USE:

EXEC [DB-A].dbo.sp_executesql N'DROP INDEX TableA.idx_TableA'
Run Code Online (Sandbox Code Playgroud)