2015-05-29 31 views
1

从这个激励了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 

当然,这并不如@schemaName在工作FROM子句是不能够被parametrised。还有构建OBJECT_ID函数的对象名称的问题。

我想编写一个过程,从模式A,将能够删除模式B中的表上的索引,如果它存在。

+2

有作为' .sys.indexes'没有这样的事情。它是' .sys.indexes' –

+0

感谢您的反馈。我会注意到它的未来。在讨论各种数据库产品中的类似概念时,我感到困惑。 –

+0

模式是查询的'dbo'部分。您可能在同一数据库的不同模式下的'dbo.instruments'和'dbo2.instruments'上有多个'IX_Test'。 –

回答

0

尝试

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 = '''[email protected]+''' AND i.object_id = OBJECT_ID('''[email protected] + '.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 
+0

谢谢你的回应。它看起来很有希望。我稍后再回来查看,并报告它是否完全符合我的要求。 –

+0

它似乎,当我测试它 – FuzzyJulz

+1

谢谢@FuzzyJulz。这做到了。为了适应我的情况,我调整了我的解决方案,但是你帮了很多。 –

相关问题