大家好吗能有人告诉我为什么这里出现错误就是存储过程
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表
上使用非聚集列存储索引答案 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