我需要可靠的代码来说"创建索引,如果它不存在。";
我以为我有了:
IF NOT EXISTS (SELECT *
FROM sys.indexes
WHERE name = 'IX_GraphedTripleValueBit_PropertyDefinitionId'
AND object_id = OBJECT_ID('internal_dot_dotalign_dot_com_teams_1.GraphedTripleValueBit'))
BEGIN
CREATE INDEX IX_GraphedTripleValueBit_PropertyDefinitionId
ON internal_dot_dotalign_dot_com_teams_1.GraphedTripleValueBit(PropertyDefinitionId)
INCLUDE (GraphedEntityRootUid)
END;
但是我得到了这个错误:
操作失败,因为索引或统计数据名称为'IX_GraphedTripleValueBit_PropertyDefinitionId'已经存在于表'GraphedTripleValueBit'上
我需要检查sys.indexes
和sys.stats
吗?(?)
我们的SQL是代码生成的(c#,而不是实体框架),并在部署时针对客户端的SQL Azure DB运行。因此,至少在他们的DBA在线提供访问权限之前,我无法轻易地进入那里,直接查看sys表。此外,有很多这样的表,所以我不想在检查时产生额外的开销,除非需要(尽管现在检查sys。统计是我的主要理论)。所以想在这里问一下。
想法吗?
仔细检查,似乎有两个应用程序实例试图迁移同一个表。假设,IF NOT EXISTS条件是在true语句的时候检查的,但是当它执行CREATE语句的时候,已经有一个冲突的索引了。