我正在创建一个表上的聚集索引,如果它已经存在,我将删除它。
我正在使用这个查询。
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.现在,在我的第二个查询中,我想知道创建了哪个索引。如果两者都没有被创建,那么如何删除聚集索引,如果它存在,并创建一个新的索引。
发布于 2020-03-02 12:22:31
可以尝试使用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或聚集索引,可以尝试使用动态sql创建脚本,并使用sp_executesql执行该脚本。
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.
。
https://stackoverflow.com/questions/60488690
复制相似问题