【问题标题】:How do you check if a certain index exists for a table in another schema?如何检查另一个模式中的表是否存在某个索引?
【发布时间】:2015-05-29 07:55:20
【问题描述】:

灵感来自这个 SO Question

我创建了这个程序:

CREATE PROCEDURE [dbo].[dropIndexWithSchema](@schemaName VARCHAR(200), @tableName VARCHAR(200), @indexName VARCHAR(200))
AS
BEGIN
    DECLARE @sql nvarchar(512)

    IF EXISTS (SELECT i.* FROM @schemaName.sys.indexes i WHERE i.name = @indexName AND i.object_id = OBJECT_ID(@schemaName + '.dbo.' + @tableName))
    BEGIN
        SELECT @sql = 'DROP INDEX ' + @indexName + ' ON ' + @schemaName + '.dbo.' + @tableName;
        EXEC sp_executesql @sql
    END
END
GO

当然这不起作用,因为 FROM 子句中的 @schemaName 无法参数化。还有为OBJECT_ID函数构造对象名的问题。

我想编写一个过程,该过程将从模式 A 中删除模式 B 中表的索引(如果存在)。

【问题讨论】:

  • 没有<schemaname>.sys.indexes 这样的东西。这是<database>.sys.indexes
  • 感谢您的反馈。我会注意它的未来。在谈论各种数据库产品中的类似概念时,我感到很困惑。
  • 架构是查询的dbo 部分。您可能在同一数据库的不同架构中的 dbo.instrumentsdbo2.instruments 上有多个 IX_Test

标签: sql-server


【解决方案1】:

试试

CREATE PROCEDURE [dbo].[dropIndexWithSchema](@schemaName VARCHAR(200), @tableName VARCHAR(200), @indexName VARCHAR(200))
AS
BEGIN
    DECLARE @sql nvarchar(512)
    DECLARE @query NVARCHAR(MAX) = 'SELECT i.* FROM ' + @schemaName+'.sys.indexes i WHERE i.name = '''+@indexName+''' AND i.object_id = OBJECT_ID('''+@schemaName + '.dbo.' + @tableName+''')'
    EXEC sp_executesql @query
    IF (@@rowcount > 0)
    BEGIN
        SELECT @sql = 'DROP INDEX ' + @indexName + ' ON ' + @schemaName + '.dbo.' + @tableName;
        EXEC sp_executesql @sql
    END
END
GO

【讨论】:

  • 感谢您的回复。它看起来很有希望。稍后我会回来查看并报告它是否完全符合我的要求。
  • 它似乎,当我测试它时
  • 谢谢@FuzzyJulz。这做到了。我调整了我的解决方案以进一步适应我的情况,但你帮了很多忙。
猜你喜欢
  • 2011-02-10
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多