Как обновить две таблицы в одном из операторов SQL Server 2005?

Я хочу обновить две таблицы за один раз. Как мне это сделать в SQL Server 2005?

UPDATE 
  Table1, 
  Table2
SET 
  Table1.LastName='DR. XXXXXX', 
  Table2.WAprrs='start,stop'
FROM 
  Table1 T1, 
  Table2 T2
WHERE 
  T1.id = T2.id
AND 
  T1.id = '010008'

Ответ 1

Вы не можете обновлять несколько таблиц в одном из операторов, однако вы можете использовать транзакцию, чтобы убедиться, что два оператора UPDATE обрабатываются атомарно. Вы также можете их выгружать, чтобы избежать кругового путешествия.

BEGIN TRANSACTION;

UPDATE Table1
  SET Table1.LastName = 'DR. XXXXXX' 
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '011008';

UPDATE Table2
SET Table2.WAprrs = 'start,stop'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '011008';

COMMIT;

Ответ 2

Вы не можете обновлять сразу две таблицы, но вы можете связать обновление со вставкой с помощью OUTPUT INTO, и вы можете использовать этот вывод в качестве соединения для второго обновления:

DECLARE @ids TABLE (id int);
BEGIN TRANSACTION

UPDATE Table1 
SET Table1.LastName = 'DR. XXXXXX'  
OUTPUT INSERTED.id INTO @ids
WHERE T1.field = '010008';

UPDATE Table2 
SET Table2.WAprrs = 'start,stop' 
FROM Table2 
JOIN @ids i on i.id = Table2.id;

COMMIT;

Я изменил пример вашего условия WHERE, чтобы быть каким-то другим полем, чем id, если id, вам не нужен этот причудливый OUTPUT, вы можете просто ОБНОВИТЬ вторую таблицу для того же id = '010008'.

Ответ 3

Извините, афайк, вы не можете этого сделать. Чтобы обновить атрибуты в двух разных таблицах, вам нужно будет выполнить два отдельных оператора. Но они могут быть в пакете (набор SQL, отправленный на сервер за один раз)

Ответ 4

Короткий ответ на этот вопрос - нет. Хотя вы можете ввести несколько таблиц в предложение from оператора обновления, вы можете указать только одну таблицу после ключевого слова update. Даже если вы пишете "обновляемый" вид (который представляет собой просто представление, которое следует определенным ограничениям), такие обновления будут неудачными. Вот соответствующие клипы из документации MSDN (акцент мой).

UPDATE (Transact-SQL)

Реле, на которое ссылается table_or_view_name, должно быть обновляемым и ссылаться на одну базовую таблицу в предложении FROM представления. Дополнительные сведения об обновляемых представлениях см. В разделе CREATE VIEW (Transact-SQL).

CREATE VIEW (Transact-SQL)

Вы можете изменить данные базовой таблицы с помощью представления, если выполняются следующие условия:

  • Любые изменения, включая инструкции UPDATE, INSERT и DELETE, должны ссылаться на столбцы из только одной базовой таблицы.
  • Столбцы, которые изменяются в представлении, должны напрямую ссылаться на базовые данные в столбцах таблицы. Столбцы не могут быть выведены никаким другим способом, например, через следующее:
    • Агрегатная функция: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR и VARP.
    • Вычисление. Столбец не может быть вычислен из выражения, которое использует другие столбцы. Столбцы, которые формируются с использованием заданных операторов UNION, UNION ALL, CROSSJOIN, EXCEPT и INTERSECT, вычисляются и также не могут обновляться.
  • Измененные столбцы не зависят от предложений GROUP BY, HAVING или DISTINCT.
  • TOP не используется нигде в select_statement представления вместе с предложением WITH CHECK OPTION.

Однако, честно говоря, вам следует рассмотреть возможность использования двух разных операторов SQL в транзакции в соответствии с примером LBushkin.

UPDATE: Мое первоначальное утверждение о том, что вы можете обновлять несколько таблиц в обновляемом представлении, было неправильным. В SQL Server 2005 и 2012 он будет генерировать следующую ошибку. Я исправил свой ответ, чтобы отразить это.

Msg 4405, Level 16, State 1, Line 1

View or function 'updatable_view' is not updatable because the modification affects multiple base tables.

Ответ 5

Вы должны поместить в транзакцию два оператора обновления

Ответ 6

Это работает для MySQL и на самом деле является просто неявной транзакцией, но должно выглядеть примерно так:

UPDATE Table1 t1, Table2 t2 SET 
t2.field = t2.field+2,
t1.field = t1.field+2

WHERE t1.id = t2.foreign_id and t2.id = '123414'

если вы делаете обновления для нескольких таблиц, для которых требуются несколько операторов... что, вероятно, возможно, если вы их обновите, а затем другое на основе других условий... вы должны использовать транзакцию.

Ответ 7

Вы можете написать оператор update для одной таблицы, а затем триггер в первой таблице, обновление вторая таблица

Ответ 8

Это так же просто, как этот запрос, показанный ниже.

UPDATE 
  Table1 T1 join Table2 T2 on T1.id = T2.id
SET 
  T1.LastName='DR. XXXXXX', 
  T2.WAprrs='start,stop'
WHERE 
  T1.id = '010008'