如何检查另一个模式中的表是否存在特定索引?

10 浏览
0 Comments

如何检查另一个模式中的表是否存在特定索引?

受到这个SO问题的启发,我创建了这个过程:

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的表上删除索引。

0
0 Comments

原因:用户想要知道如何检查另一个模式中的表是否存在某个特定索引。

解决方法:

用户尝试创建一个存储过程来解决问题。存储过程的代码如下:

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

用户感谢回复并表示这个解决方法看起来非常有希望。他们会稍后检查并报告是否完全符合他们的要求。用户测试后发现这个解决方法似乎行得通。用户感谢帮助并表示这个解决方法对他们非常有帮助。

0