Mi base de datos contiene tres tablas llamadas Object_Table
, Data_Table
y Link_Table
. La tabla de enlaces solo contiene dos columnas, la identidad de un registro de objeto y la identidad de un registro de datos.
Quiero copiar los datos desde DATA_TABLE
donde están vinculados a una identidad de objeto dada e insertar registros correspondientes en Data_Table
y Link_Table
para una identidad de objeto dada diferente.
Yo puedo hacer esto mediante la selección en una variable de tabla y el bucle a través de hacer dos inserciones para cada iteración.
¿Es esta la mejor manera de hacerlo?
Editar : Quiero evitar un bucle por dos razones, la primera es que soy vago y una tabla de bucle / temp requiere más código, más código significa más lugares para cometer un error y la segunda razón es una preocupación por el rendimiento.
Puedo copiar todos los datos en una inserción, pero ¿cómo hago para que la tabla de enlaces se vincule a los nuevos registros de datos donde cada registro tiene una nueva identificación?
fuente
Respuestas:
En una declaración : No.
En una transacción : sí
La buena noticia es que también se garantiza que el código anterior es atómico y se puede enviar al servidor desde una aplicación cliente con una cadena sql en una sola llamada de función como si fuera una declaración. También puede aplicar un disparador a una tabla para obtener el efecto de una sola inserción. Sin embargo, en última instancia, todavía son dos declaraciones y probablemente no desee ejecutar el disparador para cada inserción.
fuente
insert into ... select ...
declaración. ¿Cómo lee el código anterior o recorre los datos de Object_Table? Aún así, debe usar una variable de tabla que el autor de la pregunta no quería hacer.Todavía necesita dos
INSERT
declaraciones, pero parece que desea obtener laIDENTITY
primera inserción y usarla en la segunda, en cuyo caso, es posible que desee examinarOUTPUT
oOUTPUT INTO
: http://msdn.microsoft.com/en- us / library / ms177564.aspxfuente
Lo siguiente establece la situación que tuve, usando variables de tabla.
Gracias a otra respuesta que me indicó la cláusula OUTPUT, puedo demostrar una solución:
Sin embargo, resulta que no es tan simple en la vida real debido al siguiente error
Todavía puedo
OUTPUT INTO
una tabla temporal y luego terminar con la inserción normal. Entonces puedo evitar mi ciclo pero no puedo evitar la tabla temporal.fuente
Parece que la tabla Enlace captura la relación muchos: muchos entre la tabla Objeto y la tabla Datos.
Mi sugerencia es utilizar un procedimiento almacenado para administrar las transacciones. Cuando desee insertar en la tabla Objeto o Datos, realice sus inserciones, obtenga los nuevos ID e insértelos en la tabla Enlace.
Esto permite que toda su lógica permanezca encapsulada en una sproc fácil de llamar.
fuente
Si desea que las acciones sean más o menos atómicas, me aseguraré de incluirlas en una transacción. De esa manera, puede estar seguro de que ambos sucedieron o que ambos no sucedieron según sea necesario.
fuente
Puede crear una Vista seleccionando los nombres de columna requeridos por su declaración de inserción, agregar un Disparador INSTEAD OF INSERT e insertar en esta vista.
fuente
Quiero hacer hincapié en usar
para la transacción MSSQL con múltiples sentencias sql.
Ver: https://msdn.microsoft.com/en-us/library/ms188792.aspx Proporcionan un muy buen ejemplo.
Entonces, el código final debería verse así:
fuente
El inserto solo puede funcionar en una mesa a la vez. Las inserciones múltiples deben tener varias declaraciones.
No sé si necesita hacer un bucle a través de una variable de tabla: ¿no puede simplemente usar un inserto en masa en una tabla, luego el inserto en masa en la otra?
Por cierto, supongo que te refieres a copiar los datos de Object_Table; de lo contrario la pregunta no tiene sentido.
fuente
Antes de poder hacer una inserción multitarea en Oracle, puede usar un truco que implique una inserción en una vista que tenga un disparador INSTEAD OF definido para realizar las inserciones. ¿Se puede hacer esto en SQL Server?
fuente
fuente
// si quieres insertar lo mismo que la primera tabla
// o si quieres insertar ciertas partes de la tabla uno
// Sé que parece demasiado bueno para estar en lo cierto, pero funciona y puedes seguir agregando consultas solo cambia el
Tengo 17 tablas en las que esto ha funcionado.
fuente