2013-05-22 2 views
1

Я получаю серьезную ошибку - код 20, из инструкции Merge, и я не уверен, почему. MERGE работает нормально, если я удаляю предложение OUTPUT $ action и обновляет/вставляет целевую таблицу, как ожидалось. Как только я помещаю предложение OUTPUT внутри, либо как простое действие OUTPUT $, либо сохраняя его в переменной таблицы, а выбрав из него, он вызывает уровень ошибки 20. Я использую два CTE для цели и источника. Не уверен, что это способствует этой проблеме, но, как я уже сказал, он отлично работает без предложения OUTPUT. Использование SQL Server 2008. Я удалил большую часть столбцов для удобства чтения здесь.Сильная ошибка в заявлении MERGE OUTPUT

USE [DM] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[MergeMDATEST] 

@InsertAuditKey INT = 10 
,@UpdateAuditKey INT = 1 

AS 
SET NOCOUNT ON; 

DECLARE @RowCounts TABLE (mergeAction varchar(20)); 
-------------------------------------------- 
--- CTEs to add in Binary_Checksum Calcs --- 
WITH SourceQuery AS 
(
SELECT TOP 100 
    [Company] 
    ,[AccountNumber] 
    ,BINARY_CHECKSUM([Company]) As [Checksum] 
FROM #temptestMergeSource 
) 

,TargetTable AS 
(
SELECT TOP 100 
    [Company] 
    ,BINARY_CHECKSUM([Company]) As [Checksum] 
FROM #temptestMergeTarget 
) 

MERGE TargetTable AS Target 
USING SourceQuery As Source 
    ON (
     Target.[AccountIndex] = Source.[AccountIndex] 
     AND Target.[CodeID] = Source.[CodeID] 
     AND Target.[GroupID] = Source.[GroupID] 
     ) 
WHEN MATCHED AND (Target.[Checksum] <> Source.[Checksum]) THEN 
    UPDATE SET 
      [AccountNumber] = Source.[AccountNumber] 
      ,[AuditKey] = @UpdateAuditKey 

WHEN NOT MATCHED THEN 
    INSERT (
      [Company] 
      ,[AuditKey] 
      ) 
    VALUES (
      Source.[Company] 
      ,@InsertAuditKey 
      ) 
OUTPUT $action INTO @RowCounts; 

SELECT * FROM @RowCounts 
-----RowCounts returned for auditing 
--SELECT 
-- COUNT(CASE WHEN mergeAction = 'Insert' THEN 1 ELSE 0 END) As [INSERT] 
-- ,COUNT(CASE WHEN mergeAction = 'Update' THEN 1 ELSE 0 END) As [UPDATE] 
--FROM @RowCounts 
+2

Это похоже на ошибку в SQL Server [возможно, связанную с этим] (http://connect.microsoft.com/SQLServer/feedback/details/581548). Я также смог воспроизвести его на SQL Server 2012 (как 11.0.2376, так и 11.0.3339) и не вставляя в переменную @table. Проблема исчезнет, ​​если полностью удалить предложение OUTPUT. Вам следует обратиться в службу поддержки продуктов. –

+0

Кроме того, вы должны использовать традиционные пути обновления/вставки кода вместо MERGE. В дополнение к этой ошибке есть много других, которые не были исправлены. [Я перечисляю некоторые здесь] (http://www.sqlperformance.com/2013/02/t-sql-queries/another-merge-bug) (прокрутите вниз) и [Alex K перечисляет некоторые здесь] (http: // dba.stackexchange.com/a/14860/1186) (некоторые могут перекрываться). –

+0

Благодарим за отзыв. Я свяжусь и посмотрю, можем ли мы пролить свет на это. Никогда не писал бы слияния с CTE и исходными представлениями, если бы я знал, что эти проблемы существуют! – Volvox

ответ

5

Расчетный столбец в CTE Target, объединенный с производным предложением, приводит к фатальной ошибке. Сообщение об ошибке на Microsoft Connect

+0

+1 - еще одна отметка в моем растущем списке аргументов против 'MERGE'. :-) –

+1

Возможно, это связано с [этой ошибкой] (http://connect.microsoft.com/SQLServer/feedback/details/581548), которая исправлена ​​в 2012 году, но вряд ли будет возвращена в 2008/2008 R2, если только достаточно людей, которые поддерживают эту проблему (подсказка, подсказка). –

Смежные вопросы