在具有列存储索引的表中插入时出错

时间:2017-08-26 13:38:01

标签: sql sql-server sql-server-2012

大家好吗能有人告诉我为什么这里出现错误就是存储过程

IF EXISTS(SELECT 1 FROM SYS.procedures WHERE NAME = 'InsertCategory')
BEGIN
DROP PROC InsertCategory
END

 GO
 Create proc dbo.InsertCategory
  @category nvarchar

   As 
   Begin

Declare @rs Int
Set @rs = 0

If(@category is not null)
BEGIN
    Alter Index Category_Clus On Categories Disable
        Set @rs =1
END
IF(@rs = 1)
BEGIN
    Insert Into Categories (
        Category)
    Values (
        @category)      
END

Alter Index Category_Clus on Categories Rebuild

 End

错误即将到来

Msg 35330, Level 15, State 1, Procedure InsertCategory, Line 18
 INSERT statement failed because data cannot be updated in a table with a 
   columnstore index. Consider disabling the columnstore index before 
    issuing the INSERT statement, then rebuilding the columnstore index 
     after INSERT is complete.

我正在执行存储过程

Exec InsertCategory 'D'

我在Categories表

上使用非聚集列存储索引

2 个答案:

答案 0 :(得分:3)

根据错误消息,您看起来在表上有一个非聚集列存储索引,并且正在使用SQL Server 2014或更早版本。具有columstore索引的表在以后的版本中是可更新的。

除非使用动态SQL执行INSERT,否则您将无法在与INSERT语句相同的proc中禁用和重建索引。这是因为proc是使用索引编译的,并且在早期版本的SQL Server中具有列存储索引的表上不允许插入。例如:

CREATE proc dbo.InsertCategory
  @category nvarchar
AS

DECLARE @rs int;
SET @rs = 0

IF @category IS NOT NULL
BEGIN
    ALTER INDEX Category_Clus ON Categories DISABLE;
    SET @rs =1;
END
IF @rs = 1
BEGIN
    EXEC sp_executesql N'INSERT Into dbo.Categories (Category) Values (@category)'
    , N'@category nvarchar(1)'
    , @category = @category;
END;

ALTER INDEX Category_Clus ON Categories REBUILD;
GO

出于性能和并发原因,禁用和重建索引不应该针对单例插入进行常规操作。另外,我建议你为nvarchar参数指定一个显式长度,因为默认长度是1.

答案 1 :(得分:1)

下面的文章似乎讨论了类似的问题。下面的文章有一个解决方法。请参考以下文章 -     https://www.codeproject.com/Articles/226467/How-to-update-a-table-with-a-columnstore-index