Удаление столбца из таблицы (SQL Server 2008) - PullRequest
1 голос
/ 20 апреля 2011

Невозможно удалить [U_Family] столбец из таблицы ниже:

Таблица CREATE скрипт:

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

сообщение об ошибке:

'Users'table - Невозможно изменить таблицу.Индекс «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] из включенных столбцов.

Я не могу удалить этот индекс, поскольку он используется ограничением внешнего ключа, поэтому я не должен его удалять.

любойРешение ????

заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 20 апреля 2011

В SQL Server 2008 вы должны иметь возможность «воссоздать» свой индекс и удалить существующий в одной команде - попробуйте следующее:

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

WITH DROP_EXISTING должен удалить "старый "индекс с включенными столбцами.После выполнения этой команды вы сможете удалить столбец из таблицы.

0 голосов
/ 24 октября 2017

Я нашел это решение и работал для меня:

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__.

0 голосов
/ 20 мая 2013

Я использовал 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 голосов
/ 20 апреля 2011

Вам придется удалить индекс IX_Users и создать новый без U_Family.

...