2011-04-20 48 views
1

無法從下表中刪除[U_Family]列:從表問題(SQL Server 2008中)刪除列

表創建腳本:

CREATE TABLE [dbo].[Users](
    [U_Id] [int] IDENTITY(101,1) NOT NULL, 
    [U_Name] [nvarchar](50) NULL, 
    [U_Family] [nvarchar](50) NULL, 
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED 
(
    [U_Id] ASC 
), 
CONSTRAINT [IX_UserIdUnique] UNIQUE NONCLUSTERED 
(
    [U_UserId] ASC 
) 
) ON [PRIMARY] 
GO 

CREATE UNIQUE NONCLUSTERED INDEX [IX_Users(UserId)] ON [dbo].[Users] 
(
    [U_Id] ASC 
) 
INCLUDE ([U_Name], 
[U_Family])) ON [PRIMARY] 
GO 

錯誤消息:

「用戶表 - 無法修改表。索引'IX_Users(UserId)'依賴於 列'U_Family'。 ALTER TABLE DROP COLUMN U_Family失敗,因爲一個或多個對象訪問此列。

我知道這個問題是因爲該指數:

CREATE UNIQUE NONCLUSTERED INDEX [IX_Users(UserId)] ON [dbo].[Users] 
(
    [U_Id] ASC 
) 
INCLUDE ([U_Name], 
[U_Family])) ON [PRIMARY] 
GO 

,但我從來沒有發現一個語法編輯這個指數和包含的列刪除[U_Family]

我不能刪除這個索引,因爲它被外鍵約束使用,我不應該刪除它。

任何解決方案????

在此先感謝。

回答

5

在SQL Server 2008中,你應該能夠「再製造」索引和刪除現有的一個單一命令 - 試試這個:

CREATE UNIQUE NONCLUSTERED INDEX [IX_Users(UserId)] 
    ON [dbo].[Users]([U_Id] ASC) 
    WITH DROP_EXISTING 

WITH DROP_EXISTING應該放棄「老」指數與包括的專欄。一旦該命令運行完畢,您應該可以從列表中刪除列。

0

您將不得不刪除索引IX_Users並創建一個沒有U_Family的新索引。

0

我用SYS.INDEXES刪除索引,然後刪除列:

DECLARE @sql VARCHAR(max) 

SELECT @sql = 'DROP INDEX ' + idx.NAME + ' ON tblName' 
FROM sys.indexes idx 
INNER JOIN sys.tables tbl ON idx.object_id = tbl.object_id 
INNER JOIN sys.index_columns idxCol ON idx.index_id = idxCol.index_id 
INNER JOIN sys.columns col ON idxCol.column_id = col.column_id 
WHERE idx.type <> 0 
    AND tbl.NAME = 'tblName' 
    AND col.NAME = 'colName' 

EXEC sp_executeSql @sql 
GO 

ALTER TABLE tblName 
DROP COLUMN colName 
0

我發現這個解決方案,爲我工作:

DECLARE @ConstraintName nvarchar(200) 
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS WHERE 
PARENT_OBJECT_ID = OBJECT_ID('__TableName__') AND PARENT_COLUMN_ID = (SELECT 
column_id FROM sys.columns WHERE NAME = N'__ColumnName__' AND object_id = 
OBJECT_ID(N'__TableName__')) 
IF @ConstraintName IS NOT NULL 
    EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName) 
IF EXISTS (SELECT * FROM syscolumns WHERE id=object_id('__TableName__') AND 
name='__ColumnName__') 
    EXEC('ALTER TABLE __TableName__ DROP COLUMN __ColumnName__') 

只需更換__TableName____ColumnName__