2010-06-01 60 views
4

在尝试优化SQL脚本时,建议我添加索引。不同数据库上的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_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. 

任何想法表示赞赏。

回答

7

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

USE [DatabaseName] 
Drop Index [IndexName] 
+0

SQL在if语句中也不喜欢那样。也许我的IF结构不正确。 – Jim 2010-06-01 18:11:20

+0

在执行SQL针对数据库运行之前,您必须先执行USE操作。 – Joe 2010-06-01 18:12:40

+0

我现在看到,USE在IF声明的外面。谢谢。 – Jim 2010-06-01 18:18:04

6

如果您有权限,另一种方式是使用EXEC('sql')。另外请注意,查询SYS.INDEXES时,你需要与数据库名称(S)的前缀:

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') 
3

如果您不能发出USE:

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

嘿,这是很好的表示法,感谢分享! – 2013-01-09 20:04:36

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' 
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]