Se podía pasarlo en una lista separada por comas, a continuación, utilizar una función de división, y unirse en contra de los resultados.
CREATE FUNCTION dbo.SplitInts
(
@List VARCHAR(MAX),
@Delimiter CHAR(1)
)
RETURNS TABLE
AS
RETURN
(
SELECT Item = CONVERT(INT, Item)
FROM
(
SELECT Item = x.i.value('(./text())[1]', 'INT')
FROM
(
SELECT [XML] = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a
CROSS APPLY
[XML].nodes('i') AS x(i)
) AS y
WHERE Item IS NOT NULL
);
Ahora el procedimiento almacenado:
CREATE PROCEDURE dbo.doStuff
@List VARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
SELECT cols FROM dbo.table AS t
INNER JOIN dbo.SplitInts(@List, ',') AS list
ON t.ID = list.Item;
END
GO
Entonces llamarlo:
EXEC dbo.doStuff @List = '1, 2, 3, ...';
Se puede ver algunos antecedentes, otras opciones, y las comparaciones de rendimiento aquí:
Por supuesto, si usted está utilizando SQL Server 2008 o mejor, es posible que pueda pasar éstos en el uso mucho más eficiente Parámetros de valores de tabla (TVP). Ver aquí para una rápida introducción:
Para pasar un número variable de parámetros que sólo tendría lógica condicional en su código de cliente para añadir los parámetros necesarios, pero ¿quiere decir que usted quiere saber ¿Cómo pasar un número variable de 'id's al proceso almacenado? –
sí ... es algo así como pasar arreglos al procedimiento almacenado ... pero la longitud de esta matriz puede variar. – CPDS
¿Para qué es RDBMS (incluida la versión)? –