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!