Quiero actualizar dos tablas en una sola vez. ¿Cómo puedo hacer que en 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'
InformationsquelleAutor Jango | 2010-01-11

8 Comentarios

  1. 183

    No se puede actualizar varias tablas en una declaración, sin embargo, puede utilizar una transacción para asegurarse de que dos UPDATE declaraciones son tratados de forma atómica. También puede lotes para evitar un viaje redondo.

    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;
    • En realidad, yo soy la actualización de los registros de estas dos tablas del otro temptable. temptable tiene enlace a tabla1 pero no tabla2. ¿Cómo puedo actualizar el mismo registro de la Tabla2? ¿Cómo puedo vincular?
    • Basado en su comentario, usted tendría que unir a través de ambos Tabla1 y Tabla2 al actualizar Tabla2 si su consulta de actualización de las necesidades de las claves de una tercera tabla. Independientemente de eso, usted todavía tiene que hacer dos actualizaciones independientes.
    • probablemente no relacionados: esto no funciona en MYSQL debido a que la actualización de la sintaxis de mysql es diferente. tendrías que ir UPDATE Tabla1 , Tabla2 CONJUNTO de la Tabla1.LastName = ‘DR. XXXXXX’ where T1.id = T2.id
    • qué necesitamos para mantener la clave principal y clave externa relación entre ellos
    • También debe poner de su actualización de instrucciones dentro bloque try/catch para evitar la actualización parcial en caso de un error. ver a esta pregunta: stackoverflow.com/questions/1749719/…
  2. 77

    No se puede actualizar de dos tablas a la vez, pero puede vincular una actualización en una inserción de SALIDA se utilizan EN, y usted puede utilizar esta salida como una combinación de la segunda actualización:

    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;

    He cambiado tu ejemplo de que la condición sea cierta otther campo de id, si es el id de la no necesidad de esta de lujo de SALIDA, usted puede ACTUALIZAR el segundo de la tabla para el mismo id=’010008′.

    • Esto suena bien. Voy a probar esto
    • Esta es la mejor respuesta y debe ser votado como la verdadera respuesta a la pregunta original. Gracias. A mí me funcionó.
    • gracias por tú respuesta es un trabajo 100%
    • Es que T1.field supone que Table1.field?
  3. 20

    Lo siento, afaik, usted no puede hacer eso. Para actualizar los atributos en dos tablas diferentes, usted tendrá que ejecutar dos instrucciones individuales. Pero puede ser en un lote ( un conjunto de SQL enviada al servidor en una ida y vuelta)

    • Su bien. Usted no tiene que ser triste.
    • Caramba! Que debo usar el Perdón de la palabra con más frecuencia para el extra felicitaciones 😛
  4. 14

    La respuesta corta es no. Mientras que usted puede entrar en varias tablas en la from cláusula de una instrucción update, sólo se puede especificar una única tabla después de la update palabra clave. Incluso si usted no escribe una «actualizable» punto de vista (que es simplemente un punto de vista que sigue ciertas restricciones), actualizaciones de esta manera va a fallar. Aquí los clips de la documentación de MSDN (el énfasis es mío).

    ACTUALIZACIÓN (Transact-SQL)

    La vista a la que hace referencia table_or_view_name debe ser actualizable y de referencia exactamente una tabla de base de en la cláusula FROM de la vista. Para obtener más información acerca de las vistas actualizables, vea CREATE VIEW (Transact-SQL).

    CREATE VIEW (Transact-SQL)

    Usted puede modificar los datos de una tabla base subyacente a través de una vista, siempre y cuando las condiciones siguientes son verdaderas:

    • Ningún tipo de modificaciones, incluyendo UPDATE, INSERT y DELETE, debe hacer referencia a las columnas de sólo una tabla de base de.
    • Las columnas que se van a modificar en la vista deben hacer referencia directa a los datos subyacentes en las columnas de la tabla. Las columnas no se pueden obtener de ninguna otra forma, como las siguientes:
      • Una función de agregado: AVG, COUNT, SUM, MIN, MAX, AGRUPACIÓN, DESVEST, DESVESTP, VAR y VARP.
      • Un cálculo. La columna no puede ser calculado a partir de una expresión que se utiliza en las otras columnas. Las columnas que se forman por el uso de los operadores de conjunto de la UNIÓN, de la UNIÓN de TODOS, CROSSJOIN, EXCEPTO, y se CRUZAN cantidad a un cálculo y no son actualizables.
    • Las columnas que están siendo modificados no son afectados por el GROUP BY, HAVING, o DISTINTAS cláusulas.
    • SUPERIOR no es utilizado en cualquier lugar en el select_statement de la vista junto con la cláusula WITH CHECK OPTION.

    Con toda honestidad, sin embargo, se debe considerar el uso de dos diferentes sentencias SQL dentro de una transacción, como por LBushkin del ejemplo.

    ACTUALIZACIÓN: original de Mi afirmación de que usted puede actualizar varias tablas en una vista actualizable estaba equivocado. En SQL Server 2005 & 2012, se generará el siguiente error. He corregido mi respuesta para reflejar esto.

    Msg 4405, Level 16, State 1, Line 1

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

    • Mientras que no es posible actualizar un objeto de la Vista, que afectará a varias tablas, se puede crear en LUGAR DE los disparos que romper el original en distintas declaraciones (que afectan a uno de cada tabla): INSTEAD OF Specifies that the DML trigger is executed instead of the triggering SQL statement, therefore, overriding the actions of the triggering statements. INSTEAD OF cannot be specified for DDL or logon triggers.
  5. 7

    Esto funciona para MySQL y en realidad es sólo una transacción implícita pero debe ser algo como esto:

    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'

    si usted está haciendo las actualizaciones de múltiples tablas que requieren el uso de múltiples declaraciones… que es probable que sea posible si usted actualización de uno, luego otro basado en otras condiciones… usted debe utilizar una transacción. 

    • La respuesta es incorrecta, porque el OP pide SQL Server actualización.
    • Este anser todavía es relevante para otros usuarios.
    • esta respuesta debe ser evitado a toda costa. MySQL tiene bastantes peculiaridades y los olores, la mayoría de las cuales son incompatibles, pero conservó para evitar romper el código que depende de los caprichos. Actualizar fácilmente puede romper o resultado inesperado comportamiento y problemas de rendimiento
  6. -2

    Es tan simple como esta consulta se muestra a continuación.

    UPDATE 
      Table1 T1 join Table2 T2 on T1.id = T2.id
    SET 
      T1.LastName='DR. XXXXXX', 
      T2.WAprrs='start,stop'
    WHERE 
      T1.id = '010008'
    • Esto no funciona en SQL Server
    • Esta cosa funciona para mí, yo estoy usando MySQL.

Dejar respuesta

Please enter your comment!
Please enter your name here