Puede pasarlo como una lista separada por comas, luego usar una función de división y unir 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 su 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 para llamarlo:
EXEC dbo.doStuff @List = '1, 2, 3, ...';
Puede ver algunos antecedentes, otras opciones y comparaciones de rendimiento aquí:
- Dividir cadenas de la manera correcta, o la siguiente mejor camino
- Dividir cadenas:un seguimiento
- División de cadenas:ahora con menos T-SQL
- Comparación de métodos de concatenación/división de cadenas
- Procesando una lista de enteros:mi enfoque
- Dividir una lista de enteros:otro resumen
- Más información sobre la división de listas:delimitadores personalizados, prevención de duplicados y mantenimiento del orden
- Removing Duplicados de cadenas en SQL Server
Sin embargo, en SQL Server 2016 o superior, debe consultar STRING_SPLIT()
y STRING_AGG()
:
- Sorpresas y suposiciones de rendimiento:STRING_SPLIT()
- STRING_SPLIT() en SQL Server 2016:seguimiento n.º 1
- STRING_SPLIT() en SQL Server 2016:seguimiento n.º 2
- SQL Server v.Next:Rendimiento de STRING_AGG()
- Resuelva viejos problemas con las nuevas funciones STRING_AGG y STRING_SPLIT de SQL Server