Você pode passá-lo como uma lista separada por vírgulas, usar uma função de divisão e juntar os 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
);
Agora seu procedimento armazenado:
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
Então para chamá-lo:
EXEC dbo.doStuff @List = '1, 2, 3, ...';
Você pode ver alguns antecedentes, outras opções e comparações de desempenho aqui:
- Divida as strings da maneira certa – ou o próximo melhor caminho
- Separando strings:um acompanhamento
- Dividindo Strings:Agora com menos T-SQL
- Comparando métodos de divisão/concatenação de strings
- Processando uma lista de números inteiros :minha abordagem
- Dividindo uma lista de números inteiros :outro resumo
- Mais sobre listas de divisão:delimitadores personalizados, prevenção de duplicatas e manutenção da ordem
- Removendo Duplicatas de Strings no SQL Server
No SQL Server 2016 ou superior, porém, você deve consultar
STRING_SPLIT()
e STRING_AGG()
:- Surpresas e suposições de desempenho:STRING_SPLIT()
- STRING_SPLIT() no SQL Server 2016 :Acompanhamento nº 1
- STRING_SPLIT() no SQL Server 2016 :Acompanhamento nº 2
- SQL Server v.Next :Desempenho de STRING_AGG()
- Resolva problemas antigos com as novas funções STRING_AGG e STRING_SPLIT do SQL Server