Utilizar Lista de Parámetros en Stored Procedure


Tal vez se encuentren en la situación, donde deban pasarle una lista variable de parámetros a un sp. Por ejemplo, supongamos que se seleccionan los id de cliente 1,27,345,73 y deben pasarse a un sp que debe consultar los datos de los id de cliente seleccionados.

Tenemos varias soluciones posibles, inclusive, en SQL Server 2008 es posible solucionarlo utilizando un xml pasado por parámetro, pero vamos a aproximar una solución mas general, que nos sirva para diferentes motores.

Lo que hacemos es crear una función, a la que le pasamos la lista de ids separada por comas, y nos devolverá los id en una tabla que utilizaremos para filtrar los ids en la consulta de clientes.

La función:

CREATE FUNCTION intlist_to_tbl
(@list nvarchar(MAX))
RETURNS @tbl TABLE (number int NOT NULL) 
AS
BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(',', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (number)
         VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
      SELECT @pos = @nextpos
   END
   RETURN
END

El procedimiento:

CREATE PROCEDURE consultarListaClientes 
@ids varchar(50) 
AS
   SELECT id, razonsocial
   FROM   clientes 
   inner join intlist_to_tbl(@ids) i ON clientes.id = i.number

La llamada:

EXEC consultarListaClientes '1, 27, 345, 73'

Vale aclarar que esta solución no es la mas rápida, en terminos de velocidad, si la cantidad de ids a consultar es muy grande, será lenta, pero nos servirá para resolver muchas situaciones simples.

Advertisement

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s