无法使用列存储索引 (sql) 更新 table 脚本
Not able to update a table script with a columnstore index (sql)
当我尝试更新此语句时出现错误:
查询:
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
会抛出以下错误
Msg 35330, Level 15, State 1, Line 2 UPDATE statement failed because
data cannot be updated in a table with a columnstore index. Consider
disabling the columnstore index before issuing the UPDATE statement,
then rebuilding the columnstore index after UPDATE is complete.
如果您在 运行 脚本后立即收到错误,这意味着发生这种情况是因为 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)
您只需要在语句中添加一个 OPTION (RECOMPILE) 子句,如下所示:
更新dbo.TBL
SET Organization_Id= CASE Org_Id WHEN @O_hf THEN @HF WHEN @O_hg THEN @HG ELSE Orga_ID END
其中 Org_Id 在 (@O_hf,@O_hg)
选项(重新编译);
发生这种情况是因为在执行前分析脚本时,您的 table 仍然有非集群列存储,防止任何数据操作。
我的博客中有更多详细信息 post:http://www.nikoport.com/2016/03/07/columnstore-indexes-part-79-loading-data-into-non-updatable-nonclustered-columnstore/
此致,
尼科纽格鲍尔
当我尝试更新此语句时出现错误:
查询:
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
会抛出以下错误
Msg 35330, Level 15, State 1, Line 2 UPDATE statement failed because data cannot be updated in a table with a columnstore index. Consider disabling the columnstore index before issuing the UPDATE statement, then rebuilding the columnstore index after UPDATE is complete.
如果您在 运行 脚本后立即收到错误,这意味着发生这种情况是因为 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)
您只需要在语句中添加一个 OPTION (RECOMPILE) 子句,如下所示:
更新dbo.TBL
SET Organization_Id= CASE Org_Id WHEN @O_hf THEN @HF WHEN @O_hg THEN @HG ELSE Orga_ID END
其中 Org_Id 在 (@O_hf,@O_hg)
选项(重新编译);
发生这种情况是因为在执行前分析脚本时,您的 table 仍然有非集群列存储,防止任何数据操作。
我的博客中有更多详细信息 post:http://www.nikoport.com/2016/03/07/columnstore-indexes-part-79-loading-data-into-non-updatable-nonclustered-columnstore/
此致, 尼科纽格鲍尔