SQL Server 2012 の列ストア インデックス機能をテストして楽しんでいました。このようなインデックスを使用してテーブルを更新/挿入することはできないため、いくつかのオプションを読みました: 別のテーブルを保持し、一括挿入ごとに新しいパーティションを使用するか、インデックスを無効にします。 、更新/挿入を実行してから、インデックスを再構築します。
私のテストでは、後者のオプションを選択し、次のストアド プロシージャで終了しました。
-- Disable the columnstore index.
ALTER INDEX [All_Columns_Columnstore_Index] ON [dbo].[Tick] DISABLE
-- Insert data into tick table from staging table.
insert into Tick
select [Date],
SymbolID,
Price
from TickTemporary
-- Delete data from staging table.
delete from TickTemporary
-- Enable (rebuild) the columnstore index.
ALTER INDEX [All_Columns_Columnstore_Index] ON [dbo].[Tick] REBUILD
これらの行を手動で実行すると、すべて正常に動作します。しかし、この手順を実行すると、列ストア インデックスを持つテーブルでは更新/挿入を実行できないというエラーが表示されます。
どうしてこれなの?
アップデート:
以前に受け入れた回答のアドバイスに従いましたが、それでも同じ結果が得られます。
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Disable the columnstore index.
EXEC DisableColumnStoreIndex
-- Insert data into tick table from staging table.
insert into Tick
select [Date],
SymbolID,
Price
from TickTemporary
-- Delete data from staging table.
delete from TickTemporary
-- Enable (rebuild) the columnstore index.
EXEC RebuildColumnStoreIndex
sproc呼び出しの周りに「begin tran」と「commit tran」を配置しようとしました。
次のような動的SQLを使用します。
declare @sql nvarchar(max)
set @sql =
'insert into Tick
select [Date],
SymbolID,
Price
from TickTemporary'
exec(@sql)
動作しますが、実際には、動的SQLなしでやりたいと思っています。この場合はありえないのでしょうか?