2016-05-31 6 views
0

У вас есть вопрос о синтаксисе MERGE, для которого я не могу найти ответ.Синтаксис MERGE Ошибка SQL Server 2012

У меня есть следующий случай:

Step1:

create temp table #TempTbl 

Шаг2: MERGE:

MERGE INTO T1 target 
USING T2 AS source ON (bunch of columns) 

WHEN MATCHED 
    UPDATE 
     SET some columns from target equal some columns from source 

WHEN NOT MATCHED BY TARGET 
    THEN INSERT (bunch of columns) 
     VALUES (bunch of columns from SOURCE) 

OUTPUT $action, deleted.* into #TempTbl 

Что мне нужно знать для моих выше шаги не я нашел бы только пустые данные в моей временной таблице #TempTbl, как я только заявил WHEN NOT MATCHED ... THEN INSERT, а не DELETE?

Второй вопрос, какой тип колонки должен $action быть, как у меня сообщение об ошибке: имя

Column или поставляемые значения не соответствует определению таблицы

Хотя я попытался определить первый столбец из моей таблицы и varchar(100), nvarchar(100), но не повезло. Но, если я опускаю поле $action, то мое заявление работает.

+0

'@ action' должен быть один и тот же тип данных, как ваш первый столбец' # TempTbl'. Чтобы сохранить что-либо из 'deleted', вы должны удалить что-то вроде« Когда НЕ СООТВЕТСТВОВАНО от источника THEN DELETE' – gofr1

+0

@BogdanM Вы хотите сохранить измененные и/или вставленные значения? – jpw

+0

Хорошо, и какой тип должен быть? Как я писал, я уже пробовал это, но не повезло – BogdanM

ответ

5

Итак, столбец, в котором будет выполняться действие $, должен быть nvarchar(10).

следующее утверждение было бы добавить строки в временную таблицу для обоих insert и update (как обновление действительно удаления с последующей вставкой), но с различными действиями:

-- sample test data 
create table t1 (col1 int, col2 int) 
create table t2 (col1 int, col2 int) 
insert t1 values (1,1),(2,1) 
insert t2 values (2,2),(3,3) 
create table #temptbl (dml_action nvarchar(10), col1 int, col2 int) 

-- merge statement 
merge into t1 target 
using t2 as source 
    on target.col1 = source.col1 
when matched 
    then update set target.col2 = source.col2 
when not matched by target 
    then insert (col1, col2) values (source.col2, source.col2) 
output $action, inserted.col1, inserted.col2 into #temptbl ; 

-- sample result 

select * from #temptbl 

dml_action col1  col2 
---------- ----------- ----------- 
INSERT  3   3 
UPDATE  2   2 

Если вы не хотите в update строк можно обернуть всю партию в другое заявление так:

insert #temptbl (dml_action, col1, col2) 
select dml_action, col1, col2 
from 
(
    merge into t1 target 
    using t2 as source 
    on target.col1 = source.col1 
    when matched 
     then update set target.col2 = source.col2 
    when not matched by target 
     then insert (col1, col2) values (source.col2, source.col2) 
    output $action as dml_action, inserted.col1, inserted.col2 
) a 
where a.dml_action = 'INSERT' 
+2

много, много спасибо. Имейте лучший день когда-либо :). С Уважением, – BogdanM

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