当我运行下面的伪代码时:
BEGIN TRANSACTION @TName
BEGIN TRY
-- Disable columnstore index
ALTER INDEX CSIX_MyTable ON dbo.MyTable DISABLE;
MERGE INTO dbo.MyTable
...
我收到此错误:
MERGE语句失败,因为无法在具有列存储索引的表中更新数据。考虑在发出MERGE语句之前禁用列存储索引,然后在MERGE完成后重建列存储索引。
我不了解的是,在执行之前,我显然禁用了索引MERGE
。我已经进行了两次,三次和四次检查,确认我禁用了正确的索引。实际上,如果我自己执行该ALTER INDEX
语句,然后再次运行上面的代码块,则MERGE
完成就可以了。关于为什么发生这种情况或如何解决的任何想法?
编辑:
我也有下面的伪代码,可以毫无问题地执行:
BEGIN TRANSACTION @TName
BEGIN TRY
-- Disable columnstore index
ALTER INDEX CSIX_MyTable2 ON dbo.MyTable2 DISABLE;
INSERT INTO #MyTempTable(Columns...)
SELECT Columns...
FROM (
MERGE INTO dbo.MyTable
...
OUTPUT ...
) A
...
索引被禁用,MERGE
进程顺利进行。似乎由于某种原因,包装INSERT
语句似乎“欺骗”了编译器以执行代码。
我确定将ALTER INDEX
语句移至另一个任务可以解决该问题,但是我对这个问题的希望是尝试找出为什么代码无法按原样运行。
一个猜测:代码在编译时被拒绝。SQL获取您的脚本,对其进行解析,查看合并,确定是否存在列存储索引,并引发并返回错误...而不够聪明,无法“注意到”在上一步中已禁用该索引。
我不知道这是问题所在,但是我以前见过类似的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句