在尝试优化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.
任何想法都表示赞赏。
答案 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]