subconsultas - ¿Cómo actualizar dos tablas en una declaración en SQL Server 2005?
subquery sql server ejemplos (7)
Debe colocar dos instrucciones de actualización dentro de una transacción
Quiero actualizar dos tablas de una vez. ¿Cómo hago eso 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''
Esto funciona para MySQL y en realidad es solo una transacción implícita, pero debería 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 está realizando actualizaciones de tablas múltiples que requieren declaraciones múltiples ... lo cual es posible si actualiza una, luego otra basada en otras condiciones ... debe usar una transacción.
La respuesta corta a eso es no. Si bien puede ingresar varias tablas en la cláusula from
de una declaración de actualización, solo puede especificar una sola tabla después de la palabra clave de update
. Incluso si escribe una vista "actualizable" (que es simplemente una vista que sigue ciertas restricciones), las actualizaciones como esta fallarán. Aquí están los clips relevantes de la documentación de MSDN (el énfasis es mío).
La vista a la que hace referencia table_or_view_name debe ser actualizable y hacer referencia exactamente a una tabla base en la cláusula FROM de la vista. Para obtener más información acerca de las vistas actualizables, vea CREATE VIEW (Transact-SQL).
Puede modificar los datos de una tabla base subyacente a través de una vista, siempre que se cumplan las siguientes condiciones:
- Cualquier modificación, incluidas las instrucciones UPDATE, INSERT y DELETE, debe hacer referencia a las columnas de una sola tabla base .
- Las columnas que se modifican en la vista deben hacer referencia directamente a los datos subyacentes en las columnas de la tabla. Las columnas no se pueden derivar de ninguna otra manera, como por ejemplo a través de:
- Una función agregada: AVG, COUNT, SUM, MIN, MAX, AGRUPACIÓN, STDEV, STDEVP, VAR y VARP.
- Un cálculo. La columna no se puede calcular a partir de una expresión que utiliza otras columnas. Las columnas que se forman utilizando los operadores de conjunto UNION, UNION ALL, CROSSJOIN, EXCEPT e INTERSECT ascienden a un cálculo y tampoco son actualizables.
- Las columnas que se modifican no se ven afectadas por las cláusulas GROUP BY, HAVING o DISTINCT.
- TOP no se usa en ninguna parte de la select_statement de la vista junto con la cláusula WITH CHECK OPTION.
Honestamente, sin embargo, debería considerar usar dos declaraciones SQL diferentes dentro de una transacción según el ejemplo de LBushkin.
ACTUALIZACIÓN: Mi afirmación original de que puede actualizar varias tablas en una vista actualizable es incorrecta. En SQL Server 2005 y 2012, 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.
Lo siento, afaik, no puedes hacer eso. Para actualizar atributos en dos tablas diferentes, deberá ejecutar dos instrucciones por separado. Pero pueden estar en un lote (un conjunto de SQL enviado al servidor en un viaje de ida y vuelta)
No puede actualizar dos tablas a la vez, pero puede vincular una actualización en una inserción usando OUTPUT INTO, y puede usar esta salida como unión para 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;
Cambié tu ejemplo WHERE condición para ser algún otro campo que id, si es id, no necesitas esta elegante SALIDA, puedes ACTUALIZAR la segunda tabla para la misma ID = ''010008''.
No puede actualizar varias tablas en una sola declaración, sin embargo, puede usar una transacción para asegurarse de que dos instrucciones UPDATE
se tratan atómicamente. También puedes mezclarlos 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;
Puede escribir una declaración de actualización para una tabla y luego un desencadenante en la primera actualización de la tabla , que actualiza la segunda tabla