Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

como insertar varios registros en sql

Estas en el tema de como insertar varios registros en sql en el foro de SQL Server en Foros del Web. Hola estoy trabajando en una aplicacion donde necesito insertar todas las notas de un estudiante de todas las materias que cursa en ese año por ...
  #1 (permalink)  
Antiguo 17/03/2008, 08:47
 
Fecha de Ingreso: marzo-2008
Mensajes: 6
Antigüedad: 16 años, 1 mes
Puntos: 0
como insertar varios registros en sql

Hola estoy trabajando en una aplicacion donde necesito insertar todas las notas de un estudiante de todas las materias que cursa en ese año por bimestres luego sumarlas vertical y horizontal , la tabla calificaciones tiene la siguente estructura id_estudiante |ID_Materia |Año_lectivo |Bimestre |Calificación

En la aplicacion tengo todos los campos que deseo llevar a la base de datos y cuando le doy guardar se deben guardar todos uno debajo del otro.
si me pueden dar una idea de como lo puedo lograr. se los agradezco gracias.
  #2 (permalink)  
Antiguo 17/03/2008, 12:27
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: como insertar varios registros en sql

Bien, tu problema tiene varias soluciones, y cada una tiene sus pros y sus contras.

En primer lugar, es necesario saber que (al menos hasta SQLServer 2000) no es posible mandarle un arreglo como parámetros de un SP, a menos que se armen en una cadena char pero es sumamente ineficiente, al menos yo no lo recomiendo... mis dos soluciones son las siguientes.

1.- Utilizar un procedimiento almacenado de insert directo en la tabla, este procedimiento es un SP ordinario de inserts que obviamente recibirá como parámetros todos los valores de los campos de la tabla en la que hará la inserción. Algo como esto.

Nota: Observa que los tipos de datos que especificó son meras suposiciones mías :p

Código:
Create Procedure SPInsertarRegistros
(
    @IdEstudiante As Integer,
    @IdMateria As Integer,
    @AñoLectivo As Integer,
    @Bimestre As Integer,
    @Calificacion As Double
)
As
    --Obviamente aqui deberías hacer todas las validaciones que creamos necesarias, es decir,
    --como revisar previamente si el registro existe mediante los campos llave de tu tabla, etc..
    Insert Into TbCalificaciones (IdEstudiante, IdMateria, AñoLectivo, Bimestre, Calificacion)
    Values (@IdEstudiante, @IdMateria, @AñoLectivo, @Bimestre, @Calificacion)
Go
Entonces, tu aplicación debería hacer un ciclo registro por registro que desee insertar y llamar a este proceidimiento...

Contras: Si son demasiados registros, hay que tener en cuenta que cada insert que el SQL hace en tu tabla, requerirá un bloqueo de la misma, por lo que puede perjudicarte en el performance si es que existe alguna otra aplicación leyendo y/o escribiendo sobre esta tabla, por lo que este procedimiento es recomendable solo para cuando se tratan de pocos registros, o de una tabla exclusiva que nadie mas va a estar leyendo (una aplicación con mínimos usuarios)

2.- La segunda alternativa que tienes, y que en lo personal es la que mas utilizó es la de creat una tabla temporal desde tu aplicación, entonces vamos a necesitar de 2 procedimientos almacenados y la ejecución de 1 comando de Create Table

a) Desde tu aplicación y con un Command conectado a la BD ejecuta la siguiente línea: (OJO: Esto es desde VB, no desde SQL ok?)

Código:
ObjCmd.CommandType = adCmdText
ObjCmd.Commandtext = "Create Table #TmpCalificaciones(IdEstudiante Integer, IdMateria Integer, AñoLectivo Integer, Bimestre Integer, Calificacion Double)"
ObjCmd.Execute

ObjCmd.Text = "Insert Into #TmpCalificaciones Values (?, ?, ?, ?, ?)"

'De aqui en adelante se trata al comando como si de la ejecución de SP se tratára, es decir, creas los parámetros con Append y Create Parameter 
Después lo que viene es el ciclo donde recuperarías la información registro por registro desde tu aplicación para pasarlo a los parámetros de este comando, con lo que se insertaría todo en la tabla temporal..

El siguiente paso, es llamar a un procedimiento almacenado que asumiría que existe una tabla tamporal llamada #TmpCalificaciones (que realmente existe para el mismo ámbito de conexion), el procedimiento tendría algo como esto:

Código:
Create Procedure SpInsertaMasivoCalificaciones
(
    @CantRegistros As Integer OutPut --Para contabilizar la cantidad de registros ingresados
)
As

    Insert Into TbCalificaciones(IdEstudiante, IdMateria, AñoLectivo, Bimestre, Calificacion)
        Select IdEstudiante, IdMateria, AñoLectivo, Bimestre, Calificacion
        From #TmpCalificaciones

    Set @CantRegistros = @@RowCount

Go
Esto haría que se ingresaran todos los registros que contiene la tabla temporal (y que obviamente fueron ingresados por tu aplicacion) de un solo tajo... ¿Beneficio? el tiempo de bloqueo a tu tabla se reduce al mínimo, por que los ciclos de inserciones que tu aplicacion realizó, se los comió la tabla temporal, la cuál no te impacta en nada, solo el bloqueo final sería el que finalmente te impactaría, pero sería mínimo a diferencia que si insertaras registro por registro en la tabla final.


El truco para que esto funcione, es que tanto el commando de creacion de la tabla como el de ejecución del procedimiento masivo, se realicen con la misma conexión, sin cerrarla hasta el final, ya que si en el camino la cierras antes de ejecutar en SP Masivo, SQL destruirá tu tabla temporal... y el SP masivo te dará un error indicando que tu tabla TmpCalificaciones no existe...


espero que te sirvan estas soluciones, y platicame por cuál te fuiste y por que ¿no?

Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #3 (permalink)  
Antiguo 14/10/2010, 15:44
 
Fecha de Ingreso: octubre-2010
Ubicación: Maracay
Mensajes: 2
Antigüedad: 13 años, 6 meses
Puntos: 0
Respuesta: como insertar varios registros en sql

Gabo tu 2da solucion me sirvio de mucho la use con fox pero de casualidad sabras como capturar el parámetro de retorno en este caso el numero de registros insertados
  #4 (permalink)  
Antiguo 14/10/2010, 16:11
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: como insertar varios registros en sql

Para "capturar" cualquier data enviado por la base de datos, deberas declarar un RECORSET en tu aplicativo (Fox).

El numero de registros procesados (INSERT, DELETE, UPDATE), se almacenan en la variable: @@ROWCOUNT

Código SQL:
Ver original
  1. USE AdventureWorks2008R2;
  2. GO
  3. UPDATE HumanResources.Employee
  4. SET JobTitle = N'Executive'
  5. WHERE NationalIDNumber = 123456789
  6. IF @@ROWCOUNT = 0
  7. PRINT 'Warning: No rows were updated';
  8. GO
__________________
MCTS Isaias Islas
  #5 (permalink)  
Antiguo 15/10/2010, 17:10
Avatar de Inicia  
Fecha de Ingreso: octubre-2010
Ubicación: Actualmente en GDL
Mensajes: 135
Antigüedad: 13 años, 6 meses
Puntos: 1
Respuesta: como insertar varios registros en sql

insert into tablanueva
select campo1, campo2, campo3, campo4,
from tabla1
where estudiante like 'juanito%'
  #6 (permalink)  
Antiguo 12/03/2011, 08:47
 
Fecha de Ingreso: marzo-2011
Mensajes: 1
Antigüedad: 13 años, 1 mes
Puntos: 0
Pregunta Respuesta: como insertar varios registros en sql

Disculpen la pregunta, soy nuevo en PL y no entiendo como hacer para realizar una operacion sobre un conjunto de registros obtenidos a traves de un select en un procedimiento almacenado.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:20.