Como atualizar duas tabelas em uma instrução no SQL Server 2005?

Eu quero atualizar duas tabelas de uma só vez. Como faço isso no 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' 

   

Você não pode atualizar várias tabelas em uma declaração, no entanto, você pode usar uma transação para garantir que duas UPDATE sejam tratadas atomicamente. Você também pode agrupá-los para evitar uma viagem de ida e volta.

 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; 

Você não pode atualizar duas tabelas de uma só vez, mas pode vincular uma atualização a uma inserção usando OUTPUT INTO, e você pode usar essa saída como uma junit para a segunda atualização:

 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; 

Eu mudei o seu exemplo WHERE condição para ser algum outro campo que id, se for id o que você não precisa desta fantasia OUTPUT, você pode apenas ATUALIZAR a segunda tabela para o mesmo id = ‘010008’.

Desculpe, afaik, você não pode fazer isso. Para atualizar atributos em duas tabelas diferentes, você precisará executar duas instruções separadas. Mas eles podem estar em um lote (um conjunto de SQL enviado para o servidor em uma viagem de ida e volta)

A resposta curta para isso é não. Embora você possa inserir várias tabelas na cláusula from de uma instrução de atualização, você pode especificar apenas uma única tabela após a palavra-chave de update . Mesmo se você escrever uma visão “atualizável” (que é simplesmente uma exibição que segue certas restrições), atualizações como essa falharão. Aqui estão os clipes relevantes da documentação do MSDN (a ênfase é minha).

ATUALIZAÇÃO (Transact-SQL)

A visualização referenciada por table_or_view_name deve ser atualizável e referenciar exatamente uma tabela base na cláusula FROM da visualização. Para obter mais informações sobre exibições atualizáveis, consulte CREATE VIEW (Transact-SQL).

CREATE VIEW (Transact-SQL)

Você pode modificar os dados de uma tabela base subjacente por meio de uma visualização, desde que as seguintes condições sejam verdadeiras:

  • Quaisquer modificações, incluindo as instruções UPDATE, INSERT e DELETE, devem referenciar colunas de apenas uma tabela base .
  • As colunas que estão sendo modificadas na visualização devem referenciar diretamente os dados subjacentes nas colunas da tabela. As colunas não podem ser derivadas de nenhuma outra maneira, como por exemplo:
    • Uma function agregada: AVG, COUNT, SUM, MIN, MAX, GROUPING, DESVPAD, DESVPADP, VAR e VARP.
    • Uma computação. A coluna não pode ser calculada a partir de uma expressão que usa outras colunas. Colunas que são formadas usando os operadores de conjunto UNION, UNION ALL, CROSSJOIN, EXCEPT e INTERSECT são equivalentes a uma computação e também não são atualizáveis.
  • As colunas que estão sendo modificadas não são afetadas pelas cláusulas GROUP BY, HAVING ou DISTINCT.
  • TOP não é usado em nenhum lugar na select_statement da exibição junto com a cláusula WITH CHECK OPTION.

Com toda a honestidade, no entanto, você deve considerar o uso de duas instruções SQL diferentes dentro de uma transação, de acordo com o exemplo de LBushkin.

ATUALIZAÇÃO: Minha afirmação original de que você poderia atualizar várias tabelas em uma visualização atualizável estava errada. No SQL Server 2005 e 2012, ele gerará o seguinte erro. Eu corrigi minha resposta para refletir isso.

Msg 4405, Level 16, State 1, Line 1

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

Você deve colocar duas instruções de atualização dentro de uma transação

Isso funciona para o MySQL e é realmente apenas uma transação implícita, mas deve ser algo assim:

 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' 

se você estiver fazendo atualizações em várias tabelas que exijam várias declarações … o que provavelmente é possível se você atualizar uma e, em seguida, outra com base em outras condições … você deve usar uma transação.

Você pode escrever a instrução de atualização para uma tabela e, em seguida, um gatilho na primeira atualização da tabela , que atualiza a segunda tabela

É tão simples quanto esta consulta mostrada abaixo.

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