2016-03-18 2 views
1

Когда я пытаюсь обновлять это заявление получать сообщение об ошибке:не в состоянии обновить скрипт таблицы с индексом columnstore (SQL)

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    

Это выбросит следующая ошибка

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.

ответ

0

вам просто нужно добавить OPTION (RECOMPILE) пункт Ваше выступление, как это:

UPDATE dbo.TBL
SET Organization_Id = ДЕЛУ org_ID КОГДА @O_hf ТОГДА КОГДА @HF @O_hg THEN ELSE @HG Orga_ID END
где 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 Нойгебауером

+0

спасибо mate @niko – Binny

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) 
+0

, когда я пытаюсь запустить этот запрос, его не оценивать существование INDEX вместо пытаться Непосредственно обновлять таблицу и ее выброс ошибки, так как INDEX не упал на предыдущем шаге. 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] END UPDATE dbo.TBL SET Organization_Id = CASE Org_Id WHEN O_hf THEN HF WHEN O_hg THEN HG ELSE Orga_ID END – Binny