【问题标题】:SQL Drop Index on different Database不同数据库上的 SQL 删除索引
【发布时间】:2011-02-26 11:36:50
【问题描述】:

在尝试优化 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.

感谢任何想法。

【问题讨论】:

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


    【解决方案1】:

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

    USE [DatabaseName]
    Drop Index [IndexName]
    

    【讨论】:

    • SQL 也不喜欢 if 语句中的那个。也许我的 IF 结构不正确。
    • 在执行要针对数据库运行的 SQL 之前,您必须执行 USE。
    • 我现在看到了,USE 在 IF 语句的外面。谢谢。
    【解决方案2】:

    如果您有权限,另一种方法是使用 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')
    

    【讨论】:

      【解决方案3】:

      如果不能发出USE:

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

      【讨论】:

        【解决方案4】:

        你不妨把索引名放上去。

        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'
        

        【讨论】:

          【解决方案5】:

          使用 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]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-12
            • 1970-01-01
            • 2014-02-12
            • 1970-01-01
            • 2011-11-26
            • 2020-02-05
            • 1970-01-01
            相关资源
            最近更新 更多