![]() |
insertar datos en tablas con relacion muchos a muchos en sql server Buen día Utilizo VS 2005 y SQL server 2005. Estoy desarrollando una aplicacion web utilizando asp y c#, tengo un formulario en aspx y capturo los datos de los textbox, hago la conexion con el sql e inserto los datos que capturo del formulario. El esquema en la BD es + o - asi: tabla1 ----< tabla1tabla2 >-------- tabla2 la duda es con respecto a la insercion ya que solo inserto en la tabla1, porque yo se que por regla los datos que inserto en la tabla1 se deben ver en la tabla1tabla2 (la que resuelve el conflicto de muchos a muchos) pero no se si tambien se deben reflejar en la tabla2, ademas que no se como se debe hacer la insercion en mas de una tabla a la vez. Cabe aclarar que la insercion que hago es por medio de una variable session y un procedimiento almacenado Gracias por su colaboracion |
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server En tabla1tabla2 solo puede haber registros que a su vez esten en taba1 y tabla2 por separado: Taba1 Reg1Tabla1 Reg2Tabla1 Taba2 Reg1Tabla2 Reg2Tabla2 luego Taba1Taba2 puede tener Reg1Tabla1Reg1Tabla2 Reg1Tabla1Reg2Tabla2 Reg2Tabla1Reg1Tabla2 Reg2Tabla1Reg2Tabla2 por tanto si, debes insertar los registros en todas las tablas, es más si la bd esta bien diseñada debe impedirte de entrar nada en tabal1tabla2 si no existen correspondencias en tabla1 y tabla2 por separado. Tienes que entrar lo que capturas del formulario primero en tabla1 i/o tabla2 y luego su relacion en tabla1tabla2. Como se inserta en varias tablas, pues una cosa detras de la otra: INSERT INTO tabla1.... INSERT INTO tabla2.... INSERT INTO tabla1tabla2... Quim |
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server Hola Quim, gracias por tu respuesta Creo que con lo que me dices se puede resolver mi duda, aunque me parece raro eso de los insert seguidos y quiero saber si para procedimientos almacenados se puede hacer asi, ya que ese es mi caso. Para complementar un poco mas la info de mi problema: La tabla1 esta vacia (ahi es donde debo hacer la insercion) la tabla1tabla2 tambien esta vacia, pero la tabla2 ya tiene datos, todo esto es porque estoy trabajando en una aplicacion que no comence a hacer yo y tuve que agregar la tabla1 y posteriormente la tabla1tabla2 para resolver el conflicto muchos a muchos. Por tu atencion y colaboracion muchas gracias |
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server No te puedo poner codigo por que no domino asp pero si se como funciona, si recoges los datos de un formulario por lo que dices estaras recogiendo parejas del tipo tabla1tabla2 el dato tabla1 por lo que dices no esta en la tabla1 por tanto sea como sea tienes que hacer un insert, supongo que apoyado en un indice unico para que no entren repeticiones, el dato tabla2 ya esta en la tabla2 por tanto no hace falta hacer el insert into y finalmente el emparejamiento no esta en la tabla1tabla2 por tanto tendras que hacer el insert. Como el dato lo recoges del lado cliente y la base de datos esta en el servidor forzosamente tendras que mandar peticiones para hacer los insert a las tablas. Supongo que si puedes llamar un stored y pasarle la pareja de valores el stored puede hacer todo el trabajo y con una sola peticion al servidor pasaras, pero internamente el stored tendrá forzosamente que hacer los insert en las dos tablas. Creo que no me equivoco... pero la unica forma de poner un nuevo registro en una tabla es haciendo un insert... Quim |
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server Hola Quim Tienes razon exactamente lo que me dices es lo que habia pensado, pero sigo con la duda del stored procedure y los dos insert, aca te dejo como lo pienso hacer: CREATE PROCEDURE dbo.spProcedure @Dato1 varchar (300), @Dato2 varchar (100), @Dato3 varchar (20), @Dato4 varchar (20), @IDTabla2 int AS INSERT INTO Tabla1 (Dato1, Dato2, Dato3, Dato4) VALUES (@Dato1, @Dato2, @Dato3, @Dato4) INSERT INTO Tabla1Tabla2 (IDTabla2) VALUES (@IDTabla2) Esto lo hago asi porque el ID de la tabla 1 se genera y se incrementa automaticamente, en cambio el de la tabla 2 no Me recomiendas que cambie algo, o asi esta bien? cuando tenga resultados vuelvo a escribir, gracias por tu atencion |
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server Tendras que obtener el nuevo id de tabla1 para insertarlo en la tabla1tabla2, en esta debes insertar los dos id el de la tabla1 y el de la 2 para establecer la relacion entre ambos, como te decia en el mail anterior: Cita:
CREATE PROCEDURE dbo.spProcedure @Dato1 varchar (300), @Dato2 varchar (100), @Dato3 varchar (20), @Dato4 varchar (20), @IDTabla2 int AS INSERT INTO Tabla1 (Dato1, Dato2, Dato3, Dato4) VALUES (@Dato1, @Dato2, @Dato3, @Dato4) //Obtener el id que ha generado el insert anterior IDTabla1 INSERT INTO Tabla1Tabla2 (IDTabla1,IDTabla2) VALUES (IDTabla1,@IDTabla2) no se si el stored te soportara una subconsulta asi CREATE PROCEDURE dbo.spProcedure @Dato1 varchar (300), @Dato2 varchar (100), @Dato3 varchar (20), @Dato4 varchar (20), @IDTabla2 int AS INSERT INTO Tabla1 (Dato1, Dato2, Dato3, Dato4) VALUES (@Dato1, @Dato2, @Dato3, @Dato4) INSERT INTO Tabla1Tabla2 (IDTabla1,IDTabla2) VALUES ((Select max(idtabla1) from tabla1),@IDTabla2) El idtabla2 deberia entrar como un parametro igual que el resto de datos, ya que habra mas de uno y el cliente puede elegir qualquiera... no. Por otro lado si el idtabla1 siempre es nuevo luego la relación N a M nunca se dará!! y si es asi igual tienes un error de diseño. Si me cuentas que estamos haciendo igual te puedo orientar mejor.... Suerte y dime como ha ido. Quim |
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server Buen dia acabo de solucionar el problema, el aporte de Quim me sirvio bastante para saber como hacerlo, por eso le doy las gracias. Para los que les interese esta es la forma como quedo el SP: CREATE PROCEDURE dbo.spProcedure @Dato1 varchar (300), @Dato2 varchar (100), @Dato3 varchar (20), @Dato4 varchar (20), @IDTabla2 int AS INSERT INTO Tabla1 (Dato1, Dato2, Dato3, Dato4) VALUES (@Dato1, @Dato2, @Dato3, @Dato4) DECLARE @IDTabla1 int SET @IDTabla1 = (SELECT MAX(IDTabla1) FROM Tabla1) INSERT INTO Tabla1Tabla2 (IDTabla1,IDTabla2) VALUES (@IDTabla1,@IDTabla2) Lo de las subconsultas (sugerencia de Quim) dentro del insert no se puede hacer en SQL Server 2005. La linea que resalte se puede cambiar por: SET @IDTabla1 = SCOPE_IDENTITY() Si quieren mas info sobre SCOPE_IDENTITY(), puede verla en: "http://technet.microsoft.com/es-es/library/ms190315.aspx" Ahora resuelto este problema, me queda la duda con respecto al diseño de mi BD, Quim dijo "... si el idtabla1 siempre es nuevo luego la relación N a M nunca se dará!! y si es asi igual tienes un error de diseño". Pues precisamente, es asi, el IDTabla1 siempre es nuevo. Para contextualizar mas el problema dejo la info: Las dos tablas principales son: Donantes (tabla1) y TiposMateriales (tabla2 que ya tiene los datos), donde un donante puede donar muchos tipos de materiales y un tipo de material puede tener asociados muchos donantes, la tabla "detalle" que en mi caso es la composicion de las otras dos (DonantesTiposMateriales, tabla1tabla2) simplemente contiene los ID's de la otras dos tablas, no contiene mas campos. Se me ocurre que la PK de la tabla donantes no debe ser solo el ID, creo que deberia ser una PK compuesta ya sea ID mas el nombre, o borrar el campo ID (que se genera e incrementa automaticamente) y establecer como PK la cedula o el nombre del donante + el material donado, quedo atento a las sugerencias Muchas gracias por la colaboracion y atencion, hasta pronto |
Respuesta: insertar datos en tablas con relacion muchos a muchos en sql server Con la contextualización queda bastante claro, no puedes ligar el hecho de dar de alta un donante al hecho de establecer la relacion donante/material. El SP que has puesto si te fijas bien solo te sirve para, dar de alta un nuevo donante y su relacion con un solo material. I siempre que lo uses vas a generar un nuevo donante (nuevo id_donante -> nuevo donante). Haz te las siguientes preguntas: Como dare de alta el segundo material de un donante? Como introducire las donaciones repetitivas de distintos materiales de un mismo donante? No es un problema de que tipo id elijas para los donantes, el problema es que quieres hacerlo todo a la vez y no se puede. Primero debes elegir el donante de entre los que ya tengas (la tabla donantes ahora esta vacia pero supongo que esperas que esto cambie), si es nuevo dar lo de alta. Una vez tienes su id (nuevo o viejo), sea un incremental o un numero de documento, podras introducir tantas relaciones donante/material que quieras con simples INSERT INTO a la tabla1tabla2. Otra opcion pero no se que potencia tiene el leguaje de los SP seria poder pasar al SP el id del donante si es viejo o un nulo si es nuevo, y un array de materiales asociados al donante. Si esto es posible el SP deberá contener un condicional que si recibe un id de donante (viejo) simplemente lea el array y haga los inserts pertinentes en la tabla DonantesTiposMateriales uno para cada elelmento del array. Y si ha recibido un nulo primero haga el insert en la tabla de Donantes obtenga el id del nuevo donante y con este y el array haga los insert a DonantesTiposMateriales. Si el donante es viejo el SP tambien podria mirar si los datos1,2,3 y 4 han cambiado y hacer el update pertinente... pero creo que estaras intentanto resolver demasiadas cosas a la vez. Recuerda el viejo principio, claramente aplicable a la programación "divide y venceras". Quim |
| La zona horaria es GMT -6. Ahora son las 20:22. |
Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.