Ver Mensaje Individual
  #2 (permalink)  
Antiguo 17/03/2008, 12:27
Avatar de Gabo77
Gabo77
 
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 18 años, 1 mes
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....