重命名索引并在同一事务中询问Sys.Indexes中的新名称

时间:2010-02-24 16:00:59

标签: sql-server transactions clustered-index

我正在尝试在我们的程序中处理升级组件。 这需要更改索引的名称

EXEC sp_rename N'Sig_Summary1Index.IX_Sig_Summary1Index_StartTime',

N'Sig_Summary3Index.IX_Sig_Summary1Index1_StartTime', N'INDEX';

(我们需要与SQL SERVER 2005保持兼容)

然后检查它是否存在于同一事务中:

IF NOT EXISTS 
(   SELECT * 
    FROM sys.indexes 
    WHERE object_id = OBJECT_ID(N'[dbo].[Sig_Summary1Index]' ) 
        AND name = N'[IX_Sig_Summary1Index1_StartTime]') 

CREATE CLUSTERED INDEX [IX_Sig_Summary1Index1_StartTime] 
ON [dbo].[Sig_Summary1Index] (  
    [StartTime] ASC 
)
WITH (  
    PAD_INDEX  = OFF, 
    STATISTICS_NORECOMPUTE  = OFF, 
    SORT_IN_TEMPDB = OFF, 
    IGNORE_DUP_KEY = OFF, 
    DROP_EXISTING = OFF, 
    ONLINE = OFF, 
    ALLOW_ROW_LOCKS  = ON, 
    ALLOW_PAGE_LOCKS  = ON, 
    FILLFACTOR = 95
) 
ON [PRIMARY]

这将尝试创建索引。 :( 不知何故,在事务期间sys.indexes表还没有更新。 有没有其他方法可以避免创建此索引?

编辑:有什么方法可以“刷新”sys表来更新?手动插入记录?做一些事情,以便“检查”不会改变?

2 个答案:

答案 0 :(得分:2)

sys.tables始终与CREATE INDEX完美同步。如果您的查询未找到,则表示它查找错误的索引名称。如果你在一个事务中运行CREATE INDEX fron然后在提交之前,从另一个事务中查看sys.tables,你会陷入普通的读隔离级别,你将看不到新的索引。事务提交。这是预期和期望的行为。

答案 1 :(得分:0)

我倾向于检查索引是否存在旧名称,如果它确实丢弃它,GO

使用新名称GO重新创建索引。

这更简单。