1

[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'テーブル-テーブルを変更できません。インデックス'IX_Users(UserId)'は、列'U_Family'に依存しています。1つ以上のオブジェクトがこの列にアクセスするため、ALTER TABLE DROPCOLUMNU_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

4 に答える 4

5

SQL Server 2008では、インデックスを「再作成」して、既存のインデックスを1つのコマンドで削除できるはずです。次のことを試してください。

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

にはWITH DROP_EXISTING、含まれている列を含む「古い」インデックスを削除する必要があります。そのコマンドが実行されると、テーブルから列を削除できるようになります。

于 2011-04-20T07:57:50.527 に答える
0

インデックスIX_Usersを削除し、U_Familyなしで新しいインデックスを作成する必要があります。

于 2011-04-20T07:55:45.223 に答える
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
于 2013-05-20T10:59:48.593 に答える
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__

于 2017-10-24T13:21:42.020 に答える