1

当我尝试更新此语句时出现错误:

询问:

IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[TBL]') AND name = N'INDX NAME')   
BEGIN  
--DROP INDEX [INDX] ON [dbo].[TBL]   
ALTER INDEX [INDEX] ON [dbo].[TBL] DISABLE  
END

UPDATE dbo.TBL  
SET Organization_Id= CASE Org_Id WHEN  @O_hf THEN  @HF  WHEN @O_hg THEN @HG ELSE    Orga_ID                                                                         END   
where Org_Id in (@O_hf,@O_hg)                                                       

IF EXISTS (SELECT * FROM sys.change_tracking_tables   where object_id=OBJECT_ID(N'[dbo].[TBL]'))      
ALTER TABLE dbo.TBL       
DISABLE CHANGE_TRACKING;       

IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[TBL]') AND name = N'INDX NAME')    
BEGIN     
ALTER INDEX [INDEX] ON [dbo].[TBL] REBUILD         
END              

它会抛出以下错误

消息 35330,级别 15,状态 1,第 2 行 UPDATE 语句失败,因为无法在具有列存储索引的表中更新数据。考虑在发出 UPDATE 语句之前禁用列存储索引,然后在 UPDATE 完成后重建列存储索引。

4

2 回答 2

0

如果您在运行脚本后立即收到错误,这意味着由于 SQL 解释(编译错误)而发生这种情况。如果是这样,您需要使用动态 SQL 进行更新,如下所示(如果遇到类型不匹配错误,您可能需要使用一些强制转换)

declare @txt varchar(max) = 
'UPDATE dbo.TBL  ' + 
'SET Organization_Id= CASE Org_Id WHEN  @O_hf THEN  @HF  WHEN @O_hg THEN @HG ELSE ' +  
'Orga_ID ' +
'END ' + 
'where Org_Id in (@O_hf,@O_hg) '
exec (@txt)
于 2016-03-18T17:39:35.270 回答
0

您只需在语句中添加一个 OPTION (RECOMPILE) 子句,如下所示:

UPDATE dbo.TBL
SET Organization_Id= CASE Org_Id WHEN @O_hf THEN @HF WHEN @O_hg THEN @HG ELSE Orga_ID END
where Org_Id in (@O_hf,@O_hg)
OPTION (RECOMPILE);

发生这种情况是因为在执行之前分析脚本时,您的表仍然具有非聚集列存储,从而阻止了任何数据操作。

我在我的博客文章中有更多详细信息:http: //www.nikoport.com/2016/03/07/columnstore-indexes-part-79-loading-data-into-non-updatable-nonclustered-columnstore/

最好的问候, Niko Neugebauer

于 2016-03-19T13:51:55.947 回答