Как удалить кластерный индекс на таблицу, если она существует, и добавить новый кластерный индекс? - PullRequest
1 голос
/ 02 марта 2020

Я создаю кластеризованный индекс для таблицы и удаляю его, если он уже существует.

Я использую этот запрос.

DROP INDEX IF EXISTS CLX_Enrolment_StudentID_BatchID
ON Enrollment
CREATE INDEX CLX_Enrolment_StudentID_BatchID
ON Enrollment(Studentid, BatchId ASC);

Теперь я хочу знать, какой кластер создается здесь: - Это кластеризованный или некластеризованный?

CREATE INDEX CLX_Enrolment_StudentID_BatchID
ON Enrollment(Studentid, BatchId ASC);

Потому что при использовании: -

DROP clustered INDEX IF EXISTS CLX_Enrolment_StudentID_BatchID
ON Enrollment 

Я получаю эту ошибку: -

Incorrect syntax near the keyword 'clustered'.

И, если я использую: -

DROP INDEX IF EXISTS CLX_Enrolment_StudentID_BatchID
ON Enrollment
go
CREATE clustered INDEX CLX_Enrolment_StudentID_BatchID
ON Enrollment(Studentid, BatchId ASC); 

Я получаю эту ошибку: -

Cannot create more than one clustered index on table 'Enrollment'. Drop the existing clustered index 'PK__enrollme__DE799CE1E4649295' before creating another.

Теперь я хочу узнать в моем втором запросе, какой индекс создается. И, если ни один из них не создается, то как удалить кластерный индекс, если он существует, и создать новый.

1 Ответ

1 голос
/ 02 марта 2020

Вы можете попытаться использовать синтаксис IF EXISTS, чтобы проверить, содержит ли таблица sys.indexes индекс.

IF EXISTS(
    SELECT * 
    FROM sys.indexes 
    WHERE name='CLX_Enrolment_StudentID_BatchID' AND OBJECT_ID = OBJECT_ID('Enrollment')
)
BEGIN
    DROP INDEX CLX_Enrolment_StudentID_BatchID ON [dbo].[Enrollment]
END
GO

CREATE clustered INDEX CLX_Enrolment_StudentID_BatchID
ON Enrollment(Studentid, BatchId ASC); 

Но я думаю, что на вашей таблице из сообщения об ошибке есть индекс PK__enrollme__DE799CE1E4649295.

Изменить

Если вы хотите автоматически DROP PK или Clustered index, вы можете попробовать использовать dynamici c sql для создания сценария и использования sp_executesql до exe c, что.

DECLARE @sql NVARCHAR(500),
        @TableName VARCHAR(50) = 'Enrollment',
        @Para NVARCHAR(500)='@TableName VARCHAR(50)'

SELECT @sql = CONCAT('ALTER TABLE ',@TableName,' DROP CONSTRAINT ',name)
FROM sys.indexes 
WHERE OBJECT_ID = OBJECT_ID(@TableName) AND type_desc = 'CLUSTERED' AND is_primary_key = 1
EXEC sp_executesql @sql,@Para,@TableName

SELECT @sql = CONCAT('DROP INDEX ',name,' ON dbo.',@TableName)
FROM sys.indexes 
WHERE OBJECT_ID = OBJECT_ID(@TableName) AND type_desc = 'CLUSTERED'

EXEC sp_executesql @sql,@Para,@TableName

, если ваша таблица уже содержит PK, вам нужно использовать ALTER TABLE .... DROP CONSTRAINT вместо drop index.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...