просмотра на различных примерах о том, как создать «хороший» UPSERT заявление shown here, я создал следующий код (я изменил имена столбцов):SQL Server: UPSERT транзакция не доходя вставки
BEGIN TRANSACTION
IF EXISTS (SELECT *
FROM Table1 WITH (UPDLOCK, SERIALIZABLE), Table2
WHERE Table1.Data3 = Table2.data3)
BEGIN
UPDATE Table1
SET Table1.someColumn = Table2.someColumn,
Table1.DateData2 = GETDATE()
FROM Table1
INNER JOIN Table2 ON Table1.Data3 = Table2.data3
END
ELSE
BEGIN
INSERT INTO Table1 (DataComment, Data1, Data2, Data3, Data4, DateData1, DateData2)
SELECT
'some comment', data1, data2, data3, data4, GETDATE(), GETDATE()
FROM
Table2
END
COMMIT TRANSACTION
Мои проблема в том, что она никогда не делает часть INSERT
. Только INSERT
отлично работает. Текущий скрипт выполняет только часть обновления.
У меня есть идея, что вставка только хороша, если она может вставить все данные, которые она находит (из-за запроса выбора)? Иначе это не сработает. Если да, то как я могу его улучшить?
Я также прочитал о статье MERGE
и хотел бы избежать этого.
// EDIT:
осла несколько образцов, найденных в Интернете, и объяснено здесь, я вновь сделали мою логику выглядит следующим образом:
BEGIN TRANSACTION
BEGIN
UPDATE table1
SET something
WHERE condition is met
UPDATE table2
SET helpColumn = 'DONE'
WHERE condition is met
END
BEGIN
INSERT INTO table1(data)
SELECT data
FROM table2
WHERE helpColumn != 'DONE'
END
COMMIT TRANSACTION
При попытке других решений, то INSERT
обычно терпели неудачу или длились долго (на нескольких таблицах я могу принять это, но не очень хорошо, если вы планируете перенести целые данные из одной базы данных в другую базу данных).
Возможно, это не лучшее решение. Но на данный момент это работает, любые комментарии?
Вы в настоящее время проверить, если EXISTS возвращает любую строку, но нет никакой корреляции с фактическим UPDATE. Почему вы не хотите использовать MERGE, именно поэтому он был реализован? – dnoeth
ваш существующий запрос всегда возвращает true, когда есть *** какая-либо *** строка, которая успешно соединяется между 'table1' и' table2' - вам нужно сделать это на основе ключевой информации, которую вы проверяете снова (как пример) – Kritner
Насколько я читал, у MERGE есть свои недостатки, и, как я вижу, у меня гораздо больше контроля над данными, когда я делаю пользовательские UPDATE, INSERTS. – Asko