当我尝试更新此语句时收到错误:
QUERY:
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完成后重建列存储索引。
答案 0 :(得分: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)
答案 1 :(得分:0)
您只需要在语句中添加一个OPTION(RECOMPILE)子句,如下所示:
更新dbo.TBL
SET Organization_Id = CASE Org_Id WHEN @O_hf那么@HF WHEN @O_hg那么@HG ELSE Orga_ID结束
Org_Id在哪里(@ O_hf,@ O_hg)
选项(重建);
这是因为在执行之前分析脚本时,您的表仍然具有Nonclustered Columnstore,从而阻止任何数据操作。
我在博文中提供了更多相关详情:http://www.nikoport.com/2016/03/07/columnstore-indexes-part-79-loading-data-into-non-updatable-nonclustered-columnstore/
祝你好运, Niko Neugebauer