2016-06-12 3 views
2

Я использую SQL Server 2012 и имею две таблицы с одинаковой структурой. Я хочу, чтобы вставить новые записи из таблицы 1 в таблице 2, если они не существуют в таблице 2.Использование MERGE в SQL Server 2012 для вставки/обновления данных

Если они уже существуют, я хочу, чтобы обновить все существующие записи в таблице 2.

Там около 30 столбцов в моих таблицах, и я хочу обновить их все.

Может кто-нибудь помочь с этим? Я просмотрел различные ссылки, размещенные через Интернет, но совершенно не понимаю, как должно выглядеть мое заявление.

+2

[** Полное ** и официальная документация на 'MERGE' в ​​SQL Server] (https://msdn.microsoft.com/en-us/library/bb510625.aspx) –

+0

Я уже прочитал всю эту страницу, но я все еще смущен. – Newbie

+1

Не пытайтесь учиться на ваших 30 таблицах столбцов. Создайте несколько небольших тестовых таблиц, которые будут более управляемыми. Просто сделайте предложение update, затем, как только вы попробуете вставить, затем вставьте с условиями и т. Д. После того, как вы будете уверены в повторении в ваших таблицах монстров – Mike

ответ

9

Это действительно не так сложно ....

Понадобится:

  • источник таблицы (или запрос) для получения данных
  • целевой таблицы, чтобы объединить его в
  • условие, по которому проверяются эти две таблицы
  • заявление, что делать, если найдено совпадение (при этом условии)
  • a st atement что делать, если совпадение (при этом условии) не найдено

Так в основном, это что-то вроде:

-- this is your TARGET table - this is where the data goes into  
MERGE dbo.SomeTable AS target  
-- this is your SOURCE table where the data comes from 
USING dbo.AnotherTable AS source  
-- this is the CONDITION they have to "meet" on 
ON (target.SomeColumn = source.AnotherColumn) 

-- if there's a match, so if that row already exists in the target table, 
-- then just UPDATE whatever columns in the existing row you want to update 
WHEN MATCHED THEN       
    UPDATE SET Name = source.Name, 
       OtherCol = source.SomeCol 

-- if there's NO match, that is the row in the SOURCE does *NOT* exist in the TARGET yet, 
-- then typically INSERT the new row with whichever columns you're interested in 
WHEN NOT MATCHED THEN 
    INSERT (Col1, Col2, ...., ColN) 
    VALUES (source.Val1, source.Val2, ...., source.ValN); 
+0

спасибо .. им делать этот тест на маленьком столе сначала. я создал эту таблицу TEST1, а затем создал ее копию как TEST2. CREATE TABLE TEST1 ( ID INT, Name VARCHAR (255), Город VARCHAR (255), государственный VARCHAR (255) ) я использую это делать то, что я хочу MERGE TEST2 AS TARGET ИСПОЛЬЗОВАНИЕ TEST1 КАК ИСТОЧНИК ПО TARGET.ID = SOURCE.ID когда подобрано ТОГДА ОБНОВЛЕНИЕ Set ID = SOURCE.ID, \t \t \t Имя = SOURCE.Name, \t \t \t Город = SOURCE.City, \t \t \t State = SOURCE.State КОГДА НЕ MATCHED ТОГДА INSERT INTO TEST2 SELECT * FROM TEST1 WHERE ID NOT IN (SELECT ID FROM TEST2) – Newbie

+0

также в Интернете, я вижу людей используя некоторую временную таблицу для хранения результата слияния statmenet, однако я не использовал это в своем. Обязательно ли это делать? – Newbie

+0

хорошо это работает \t \t \t КОГДА НЕ MATCHED ТОГДА ВСТАВИТЬ (ID, имя, город, штат) ЗНАЧЕНИЯ (SOURCE.ID, SOURCE.Name, SOURCE.City, SOURCE.State); – Newbie

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