2013-09-25 71 views
3

我剛剛註冊並希望這是有道理的。將變量傳遞給DROP INDEX語句

無論如何,總之,我想測試某個列是否有索引,如果是,請刪除索引。我想知道我是否可以通過索引名稱傳遞給DROP INDEX語句。

首先,FYI表名是'Account',列名是'ID'。

要測試索引存在我用下面的(不要以爲我是任何類型的天才,我從這裏的SELECT語句): http://social.msdn.microsoft.com/Forums/sqlserver/en-US/e183be6c-1177-4f81-b130-aeeeff7638fe/how-do-you-check-if-an-index-exists-for-sql-table-column

IF EXISTS 
(SELECT 
    sysindex.name AS IndexName 
FROM 
    sys.indexes AS SysIndex 
    INNER JOIN sys.index_columns AS SysIndexCol ON SysIndex.object_id = SysIndexCol.object_id AND SysIndex.index_id = SysIndexCol.index_id 
    INNER JOIN sys.columns AS SysCols ON SysIndexCol.column_id = SysCols.column_id AND SysIndexCol.object_id = SysCols.object_id 
WHERE 
    type <> 0 
    AND SysIndex.object_id in (Select systbl.object_id from sys.tables as systbl 
    WHERE SysTbl.name = 'Account') 
    AND SysCols.name = 'ID') 

DROP INDEX dbo.Account.Account$ID; 
GO 

在DROP INDEX上面的語句我已經硬編碼了索引名稱('Account $ ID') - 如果你自己運行SELECT語句,它會顯示名稱,但它也很容易通過SSMS識別。 但是,而不是硬編碼的索引名稱,我想能夠以某種方式傳遞索引名稱(就像我說的,由SELECT語句顯示)到DROP INDEX語句。我想這將通過聲明一個變量並以某種方式將其設置爲查詢結果來完成,但我不知道該怎麼做。可以做到嗎?

回答

3

你可以使用類似的東西。注意表名被設置爲一個變量。

DECLARE @index_name NVARCHAR(MAX), @table_name NVARCHAR(MAX) 

SET @table_name = 'Account' -- your table name 

SELECT TOP 1 
    @index_name = sysindex.name 
FROM 
    sys.indexes AS SysIndex 
    INNER JOIN sys.index_columns AS SysIndexCol ON SysIndex.object_id = SysIndexCol.object_id AND SysIndex.index_id = SysIndexCol.index_id 
    INNER JOIN sys.columns AS SysCols ON SysIndexCol.column_id = SysCols.column_id AND SysIndexCol.object_id = SysCols.object_id 
WHERE 
    type <> 0 
    AND SysIndex.object_id in (Select systbl.object_id from sys.tables as systbl 
    WHERE SysTbl.name = @table_name) 
    AND SysCols.name = 'id' 

DECLARE @sql NVARCHAR(MAX) = N'DROP INDEX dbo.' + @table_name + '.' + @index_name 

IF @index_name IS NOT NULL 
    exec sp_executesql @sql 

EDIT

我添加TOP 1以上,因爲它可能返回多於一個索引的查詢。

2

嘗試這一個 -

DECLARE @index_name SYSNAME 
    , @table_name SYSNAME = 'dbo.Account' 
    , @column_name SYSNAME = 'ID' 

SELECT @index_name = i.name 
FROM sys.indexes i 
JOIN sys.index_columns ic ON i.[object_id] = ic.[object_id] 
    AND i.index_id = ic.index_id 
WHERE i.[type] > 0 
    AND i.[object_id] = OBJECT_ID(@table_name) 
    AND COL_NAME(i.[object_id], ic.column_id) = @column_name 

DECLARE @SQL NVARCHAR(MAX) = 'DROP INDEX ' + @table_name + '.' + @index_name 
EXEC sp_executesql @SQL