Pasar un Arreglo a un Stored Procedure en SQL Server 2008

Buen día a todos.

Espero que alguien me pueda orientar respecto a la duda que tengo.
Lo que quiero hacer es pasar un arreglo de enteros a un Stored Procedure. El parámetro del Stored ya fue definido como un tipo en SQL Server, se trata solo de una tabla con un campo ID. Básicamente sería como pasarle un conjunto de registros al Stored, pero no encuentro forma de hacerlo, y para empezar, si se puede hacer.
Encontré un ejemplo en C# donde usan la clase DataTable, definen las columnas y después agregan registro por registro. Una vez llena, la pasan al Stored como un parámetro más, sin mucha ciencia, pero según entiendo, en Java no existe algo similar a DataTable.
Lo intenté con java.sql.Connection.createArrayOf("int", arregloInt); pero no funcionó, pues me lanza java.sql.SQLFeatureNotSupportedException

De antemano les agradezco por su tiempo, cualquier sugerencia es bien recibida.
Saludos...

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de julgo

mmm para darte el gusto

mmm para darte el gusto puedes enviar una cadena con los datos separados por algún token ( comas por ejemplo mas usual) y guardarlas asi y luego cuando consultes separarlas en tu resultset (con la clase stringtokenizer ) , esta forma es la mas simple .
- la segunda forma seria a través de XML pero yo le tengo fobia asi que no te recomiendo.
- la declaración y manejo de arrays varian con cada base de datos , por ejemplo el driver jdbc de Oracle no admite ese método createArrayOf y parece que sql server tampoco por esa excepción , en postgresql me parece que es mas sencillo el manejo de array simplemente los declaras y envias como cualquier otro .
algunas recomendaciones seria que:

- postea el código de tu store procedure donde declaras el parámetro.
- olvídate de java y trata de insertar arrays directamente a la tabla.
- creo que sql server no admite arrays asi que postea también como declaraste las variables en tu tabla.
- la ultima forma seria que el parámetro sea una tabla ..pero por ahora has lo anterior.

Opté por la cadena

Gracias por la respuesta.

Como menciono, opté por enviar la lista de ID's en formato (id1,id2,id3,id4,id5,...), ya dentro del Stored se hace un  IN (id1,id2,id3,id4,id5,...).

Por el momento así funciona bien, pero me queda la duda respecto a la última forma que mencionas, ya que en un principio se había declarado así el parámetro de entrada. Ese parámetro estaba definido como tabla, la cual tenía solo un campo de tipo entero. Teniendo lo anterior, ¿cómo es la solución en Java que me propones?

Saludos...

Imagen de julgo

deberías explicar un poco mas

deberías explicar un poco mas por que no se si solo es un ejemplo o como yo lo entiendo estas usando un select donde comparas todos los ID's , pero tienes que escribirlos todos a mano y no tiene sentido , ¿por que mandas toda la cadena para que en el procedimiento los escribas tu? , además que tal si son muchos elementos con cantidad variable en el array , digamos 50 nada mas escribirlos IN (id1,id2,id3,id4,id5,...id50) es demasiado
en tu procedimiento implementa una función que separe la cadena y guarde cada elemento en una tabla temporal x ejemplo digamos #tabla_temporal con una sola columna de ID's.
luego harias un
IN(select id from #tabla_temporal)

Imagen de julgo

una mas

-otra solución seria que dentro de tu código java envíes cada elemento del array uno x uno a una tabla de ID's antes de llamar al procedimiento , ya después llamas al procedimiento pero ya sin parámetro(tabla o cadena) y comparas , con esta forma la función que tenias que hacer con código sql lo haces con código java .
IN(select id from #tabla_llena_desde_antes)

- o tal ves llamar a otro procedimiento almacenado donde insertes cada elemento en una variable tipo tabla .
y desde ese procedimiento se le envie el parámetro tabla a tu store procedure (con el tipo tabla de parámetro)
dentro haces algo como esto:
IN(select id from @tabla_parametro)
-directamente desde java no se puede enviar el array .

Imagen de julgo

la ultima

pero parece que nos estamos complicando un poco en tu caso parece que el uso del array es simple para consultar asi que podrias usar esa variable de cadena que tienes actualmente ; prueba algo asi tal ves resulte (yo no lo he probado y comentas.)

declare @ids varchar(50)
set @ids='id1,id2,id3'

SELECT * FROM tu_tabla WHERE id IN (@ids)

Usé los ids separados por comas

Hola Julgo.

Me desconecté un poco de esto, pero te comento.
Terminé usando una cadena con los ids separados por comas, para usarlos como mencionas en tu última respuesta y funciona correctamente.

Gracias por la ayuda. Saludos...

Imagen de lagun69

Consulta sql server

Hola a todos, tengo dos tablas ( Empleados y Entradas ), lo que quiero saber es como le hago para que la consulta me devuelva lo siguiente:
No. Nombre Reg1 Reg2 Reg3 Reg4
01 Pedro 07:10:20 11:45:00 12:36:14 18:50:44
02 Luis 09:15:20 11:05:00 11:36:14 17:50:44
La Tabla Empleado tienen los siguientes Campos;
No. int
Nombre varchar
Registros de la tabla de Empleados
01 Pedro
02 Luis
03 Paco
Y la Tabla Entradas
No. int
Fecha date
Registro time(0)
Registros de la tabla Entradas
01 2015-01-01 07:10:20
02 2015-01-01 09:15:20
01 2015-01-01 11:45:00
02 2015-01-01 11:05:00
01 2015-01-01 12:36:14
02 2015-01-01 11:36:14
01 2015-01-01 18:50:44
02 2015-01-01 17:50:44

Re: consulta sql server

Si estás utilizando SQL Server, puedes usar PIVOT. En YouTube: SQL Server Tutorial 32: Writing PIVOT and UNPIVOT queries.