2014-05-15 210 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來更新表。正如在不同的答案中提到的那樣,這是一個編譯錯誤