删除索引或更改

时间:2016-05-23 18:54:56

标签: sql sql-server

我试图在信息中删除目标表上的pk约束和删除索引,这些以下语句在第一次成功运行。

IF EXISTS (SELECT Name FROM sysindexes WHERE Name = 'xyz') 
DROP INDEX [xyz] ON [dbo].[Table_Name];

IF EXISTS (SELECT Name FROM sysindexes WHERE Name = 'xyz')
ALTER TABLE [dbo].[Table_Name] DROP CONSTRAINT [xyz];

但如果我第二次运行相同的查询则会出错:

  

无法删除索引'dbo.Table_Name.xyz',因为它不存在或您没有权限

我需要一个If ... Else语句语法,如if exists drop else end或success something。

2 个答案:

答案 0 :(得分:6)

可能的原因是您的数据库上可能有多个名为xyz的索引。您的IF EXISTS SELECT声明没有考虑哪个表格xyz

您可以通过单独运行select语句来自行检查此条件。

尝试将查询更改为以下内容以限制范围:

If Exists 
(
    Select * 
    From   sys.indexes 
    Where  name = 'xyz' 
    And    Object_Id = Object_Id('dbo.Table_Name')
)
Drop Index xyz On dbo.Table_Name;

答案 1 :(得分:0)

解决此问题的一种方法是欺骗解析器:

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE SCHEMA_NAME = 'dbo' AND TABLE_NAME = 'Table_Name' AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME = 'xyz')
BEGIN
    EXEC('ALTER TABLE [dbo].[Table_Name] DROP CONSTRAINT [xyz]')
END