2015-05-29 51 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。這做到了。爲了適應我的情況,我調整了我的解決方案,但是你幫了很多。 –

相關問題