2014-05-15 208 views
1

当我运行下面的伪代码:ALTER INDEX语句被忽略?

BEGIN TRANSACTION @TName 
BEGIN TRY 
    -- Disable columnstore index 
    ALTER INDEX CSIX_MyTable ON dbo.MyTable DISABLE; 

    MERGE INTO dbo.MyTable 

... 

我得到这个错误:

MERGE statement failed because data cannot be updated in a table with a columnstore index. Consider disabling the columnstore index before issuing the MERGE statement, then rebuilding the columnstore index after MERGE is complete.

我不明白的是,我清楚地禁用索引我执行MERGE之前。我有双重,三重和四重检查,我禁用了正确的索引。事实上,如果我自己执行ALTER INDEX语句,然后再次运行上述块,那么MERGE就完成了。任何想法,为什么会发生这种情况或我可以如何解决它?

编辑:

我也有下面的伪代码,如果没有问题,执行:

BEGIN TRANSACTION @TName 
BEGIN TRY 
    -- Disable columnstore index 
    ALTER INDEX CSIX_MyTable2 ON dbo.MyTable2 DISABLE; 

    INSERT INTO #MyTempTable(Columns...) 
    SELECT Columns... 
    FROM (
     MERGE INTO dbo.MyTable 
     ... 
     OUTPUT ... 
    ) A 

... 

该指数被禁用,而在MERGE过程顺利。看来出于某种原因,包装INSERT声明似乎“欺骗”编译器执行代码。

我确信将ALTER INDEX语句转移到另一个任务将解决问题,但我希望这个问题是试图发现代码不运行的原因。

+0

您确定这是columnstore索引吗? – Paparazzi

+0

@Blam绝对确定。 – Kittoes0124

+0

对不起,不知道你的问题的直接答案,但我建议你考虑使用this article中描述的“表格分区”方法。如果这对你有效,问题就不存在了。 –

回答

1

猜测:代码在编译时被拒绝。 SQL需要你的脚本,解析它,看到合并,确定有一个列存储索引,然后引发并返回错误......但不足以“注意”索引在前一步中被禁用。

我不知道这是问题,但我以前见过类似的问题。

+0

是的,我正在思考同样的问题,有趣的是我有另一个非常类似的脚本没有问题,我已经发布上​​面以供参考。 – Kittoes0124

0

使用columnstore索引的一个限制是,如果不禁用或删除表中的columnstore索引,就无法更新表。

一个建议是在事务语句之前使用禁用columnstore索引语句。 您也可以尝试删除columnstore索引,然后重新创建它。

-1

您需要使用动态SQL来更新表。正如在不同的答案中提到的那样,这是一个编译错误