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

次のように、ステートメントに 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/

よろしく、 ニコ・ノイゲバウアー

于 2016-03-19T13:51:55.947 に答える
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 に答える