如何检查另一个模式中的表是否存在特定索引?
如何检查另一个模式中的表是否存在特定索引?
受到这个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的表上删除索引。
原因:用户想要知道如何检查另一个模式中的表是否存在某个特定索引。
解决方法:
用户尝试创建一个存储过程来解决问题。存储过程的代码如下:
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
用户感谢回复并表示这个解决方法看起来非常有希望。他们会稍后检查并报告是否完全符合他们的要求。用户测试后发现这个解决方法似乎行得通。用户感谢帮助并表示这个解决方法对他们非常有帮助。