2011-04-05 31 views
0

大型數據庫重新設計後,我需要刪除它的所有索引,並設置新的索引。
我發現很好的scrpipt獲取所有索引並刪除,但我有問題 - 我無法刪除由主鍵約束創建的索引。 (也許還有其他類型的指數我不能刪除)。如何檢查是否可以刪除SQL Server中的數據庫索引

我的問題是:如何更改下面的代碼以除去除主鍵或其他手動創建的索引之外的所有索引,我無法手動刪除。

DECLARE @indexName VARCHAR(128) 
DECLARE @tableName VARCHAR(128) 

DECLARE [indexes] CURSOR FOR 
    SELECT [sysindexes].[name] AS [Index], [sysobjects].[name] AS [Table] 
    FROM [sysindexes] 
    INNER JOIN [sysobjects] ON [sysindexes].[id] = [sysobjects].[id]  
    WHERE [sysindexes].[name] IS NOT NULL AND [sysobjects].[type] = 'U' 

OPEN [indexes] 

FETCH NEXT FROM [indexes] INTO @indexName, @tableName 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    EXEC ('DROP INDEX [' + @indexName + '] ON [' + @tableName + ']') 
    FETCH NEXT FROM [indexes] INTO @indexName, @tableName 
END 

CLOSE [indexes] 
DEALLOCATE [indexes] 

回答

0

基於Marc_s答案我發現腳本的正確版本:

SELECT 'DROP INDEX ' + name + ' ON ' + object_name(object_id) 
FROM sys.indexes 
WHERE is_primary_key = 0 AND is_unique_constraint = 0 
AND OBJECTPROPERTY(object_id, 'IsMSShipped') = 0  -- exclude system-level tables 
AND name IS NOT NULL 

察看object_id是大於255是不夠的:
- 我們不得不使用OBJECTPROPERTY(OBJECT_ID, 'IsMSShipped')= 0,因爲像queue_messages某些系統表具有很高的ID
- 我們也有檢查,如果指數是由唯一約束創建:is_unique_constraint = 0

這些改進它會刪除由用戶創建的所有指標後。

5

你可以嘗試使用sys.indexes目錄視圖,而不是過時的sysindexes

那個目錄視圖有一列呼叫is_primary_key,所以你應該能夠找到這樣所有非主鍵索引:

SELECT * 
FROM sys.indexes 
WHERE is_primary_key = 0 

您可以輕鬆地從這個創建DROP INDEX語句:

SELECT 'DROP INDEX ' + name + ' ON ' + object_name(object_id) 
FROM sys.indexes 
WHERE is_primary_key = 0 
AND object_ID > 255  -- exclude system-level tables with object_id <= 255 
AND name IS NOT NULL -- exclude heaps with a NULL index name 

只要複製&粘貼此語句的輸出,並運行 - 你應該完成。

+0

這是一個很好的建議,使用該表,謝謝 - 但它運行由它生成的代碼是有風險的 - 它會從systables中刪除索引,併爲HEAP類型的索引返回null - 從我的示例中的代碼只返回索引定製表格 – 2011-04-05 13:23:45

+0

如果您爲該語句添加了'AND object_ID> 255並且名稱不爲NULL',則會得到相同的結果;所有「系統級」表(id <255)被排除在外,就像堆(索引名稱爲NULL) – 2011-04-05 13:37:11

+0

好的,謝謝 - 那會好很多。現在有我的索引和幾個像下面這樣的索引:「queue_clustered_index」 - 你知道它是什麼嗎? – 2011-04-05 13:48:01

相關問題